let ReturnAsync x = async { return x } let (>>=!) m f = async { return Async.RunSynchronously(f(Async.RunSynchronously m)) } let (>>!) m1 m2 = m1 >>=! fun () -> m2 let (>=>!) f g = fun x -> ((f x) >>=! g) let ApplyAsync m1 m2 = m1 >>=! fun f -> m2 >>=! fun x -> ReturnAsync (f x) let LiftAsync f = ApplyAsync (ReturnAsync f) let SequenceAsync (l : _ list) = Async.Parallel l >>=! fun a -> ReturnAsync(Array.toList a);;