second :) val userResult: Either<ExceptionCase, User> = … val companyResult: Either<ExceptionCase, Company> = … val userWithCompany = userResult.flatMap { user -> companyResult.map { company -> // Merge them } }
second :) val userResult: Either<ExceptionCase, User> = … val companyResult: Either<ExceptionCase, Company> = … val userWithCompany = EitherMonad<User>().binding { val user = bind { userResult } val company = bind { companyResult } yields(/* Merge them */) }
val companyResult: Either<ExceptionCase, Company> = … val userWithCompany = EitherMonad<User>().binding { val user = bind { userResult } val company = bind { companyResult } yields(/* Merge them */) }
val companyResult: Future<Either<ExceptionCase, Company>> = … val userWithCompany = FutureMonad<User>().binding { val user = bind { userResult } val company = bind { companyResult } yields(/* Merge them */) }
companyResult: Future<Company> = … val userWithCompany = FutureMonad<User>().binding { val user = bind { userResult } val company = bind { companyResult } yields(/* Merge them */) }
companyResult: Future<Company> = … val userWithCompany = FutureMonad<User>().binding { val user = bind { userResult } // Runs in parallel* val company = bind { companyResult } // Runs in parallel* yields(/* Merge them */) } *Potentially