scala - flatten the Option part of a Future[Option[Option[T]]] -


i have results: list[future[option[t]]] contains (parallel) calculations.

i want obtain first non-none result possible, or return none if calculations return none.

currently, i'm doing (which consider ugly) handle case future.find doesn't find results.

future.find(results)(r => r.isdefined) map {    case some(hit) => hit   case _ => none } 

which give me future[option[t]] (what want).

is there cleaner way obtain future[option[t]]: i.e. without having manually flatten future[option[option[t]]]?

rather specialise options, write general function such as:

def collectfirst[a, b](futures: list[future[a]])(pfn: partialfunction[a, b])     (implicit ex: executioncontext): future[option[b]] =   future.find(futures)(pfn.isdefinedat) map (_.collect(pfn)) 

in terms of this, rephrase problem as:

collectfirst(results) { case some(hit) => hit } 

Comments