import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{ExecutionContext, Future} trait Request trait Response trait CacheService { def isDuplicateRequest(request: Request)(implicit ec: ExecutionContext): Future[Option[Request]] def setCacheForDeduplication(dedupedReq: Option[Request])(implicit ec: ExecutionContext): Future[Boolean] } trait Processor { def process(request: Option[Request])(implicit ec: ExecutionContext): Future[Response] } class API(cacheService: CacheService, processor: Processor) { def process(request: Request): Future[Response] = { for { dedupedRequest <- cacheService.isDuplicateRequest(request) response <- processor.process(dedupedRequest) _ <- cacheService.setCacheForDeduplication(dedupedRequest) // what's wrong here? } yield response } }