Query Builder¶
Queries may be written by composing functions or using query expressions.
let xs = asyncRx {
yield 42
}
This expression is equivalent to:
let xs = AsyncRx.single 42
You can also yield multiple values:
let xs = asyncRx {
yield 42
yield 43
}
This is equivalent to:
let xs = AsyncRx.ofSeq [42; 43]
// or
let xs = AsyncRx.concat [AsyncRx.single 42; AsyncRx.single 43]
Flat mapping¶
let xs = asyncRx {
let! i = AsyncRx.single 42
yield i*10
}
This is equivalent to:
let xs =
AsyncRx.single 42
|> AsyncRx.flatMap (fun i ->
AsyncRx.single (i * 10))
}
More advanced example¶
These two examples below are equivalent:
Seq.toList "TIME FLIES LIKE AN ARROW"
|> Seq.mapi (fun i c -> i, c)
|> AsyncRx.ofSeq
|> AsyncRx.flatMap (fun (i, c) ->
AsyncRx.fromMouseMoves ()
|> AsyncRx.delay (100 * i)
|> AsyncRx.map (fun m -> Letter (i, string c, int m.clientX, int m.clientY)))
The above query may be written in query expression style:
asyncRx {
let! i, c = Seq.toList "TIME FLIES LIKE AN ARROW"
|> Seq.mapi (fun i c -> i, c)
|> AsyncRx.ofSeq
let ms = AsyncRx.fromMouseMoves () |> delay (100 * i)
for m in ms do
yield Letter (i, string c, int m.clientX, int m.clientY)
}