private <L> Response doGetIssueMentionsInfo(final Issue issue, final Function<Iterable<IssueMention>, Either<Throwable, L>> responseLoadExtractor) { final Function<Issue, Either<Throwable, Iterable<IssueMention>>> issueToMentions = new Function<Issue, Either<Throwable, Iterable<IssueMention>>>() { @Override public Either<Throwable, Iterable<IssueMention>> apply(@Nullable Issue issue) { return issueMentionService.getIssueMentions(issue.getId()); } }; final Function<L, Response> successResponse = new Function<L, Response>() { @Override public Response apply(@Nullable L load) { return Response.ok(load).build(); } }; return issueToMentions.apply(issue) .right() .flatMap(responseLoadExtractor) .fold(errorResponse(issue.getKey()), successResponse); }