Given the following methods that return a Future...
def getProducts: Future[List[Product]] = { ... }
def sendOrder(p: Product, n: Int): Future[Order] = { ... }
... I need to invoke sendOrder for each product returned by getProducts and in the end yield the number of products processed:
for {
  products <- getProducts
  // how do I iterate thru products and invoke sendOrder for each element?
  ...
} yield products.length
How do I deal with the list of products in the for comprehension above?
EDIT
Things get even more complex since I need to invoke a third method before sendOrder if and only if getProducts actually returns a nonEmpty list:
def doSomethingBeforeSendingOrder: Future[String] = { ... }
for {
  p <- getProducts
  // how do I invoke doSomethingBeforeSendingOrder before sendOrder and
  // only if getProducts actually returns a nonEmptylist?
  o <- Future.sequence(p.map(senderOrder(_,IDontKnowWhatThisIntMeans)))
} yield o.length
				
                        
I dont' know where that second arg to sendOrder should come from, but essentially you want to do something like:
Future.sequence will turn your List[Future[Order]] into a Future[List[Order]]