¿Cómo se encadenan los futuros de Scala con flatMap?

Estoy trabajando en el uso de Futures por primera vez en Scala y estoy trabajando a través de un ejemplo del uso del combinador flatMap; He estado siguiendo esta discusión:

http://docs.scala-lang.org/overviews/core/futures.html

Específicamente, este ejemplo:

val usdQuote = future { connection.getCurrentValue(USD) }
val chfQuote = future { connection.getCurrentValue(CHF) }
val purchase = for {
    usd <- usdQuote
    chf <- chfQuote
      if isProfitable(usd, chf)
} yield connection.buy(amount, chf)

purchase onSuccess {
    case _ => println("Purchased " + amount + " CHF")
}

se traduce a esto:

val purchase = usdQuote flatMap {
    usd =>
         chfQuote
        .withFilter(chf => isProfitable(usd, chf))
        .map(chf => connection.buy(amount, chf))
}

Lo que me cuesta un poco entender cómo y cuándo se ejecuta flatMap?

Entiendo que usdQuote y chfQuote se ejecutan mediante "algún hilo" en "algún momento" y se llaman a sus funciones de devolución de llamada registradas, las preguntas son:

a) ¿Se ejecutan a la vez usdQuote y chfQuote? (Estoy bastante seguro de que son).

b) ¿Cómo asigna FlatMap el valor del uso del futuro? ¿Cita a usd? Como en, ¿se llama cuando se completa la operación usdQuote?

c) ¿Qué hilo está ejecutando la operación 'flatMap' y 'map' (probablemente más como un seguimiento de la última pregunta).

Aclamaciones.

Respuestas a la pregunta(3)

Su respuesta a la pregunta