FSharpx.Async
FSharpx.Async copied to clipboard
AsyncEvent?
This would be an async version of IEvent or IObservable. The issue with IObservable alone is that consumers have to be functions of type 'a -> unit. As a result, certain operations can't be implemented. Suppose for example you wished to run an async computation as part of the observer. Calling Async.RunSynchronously defeats the purpose and Async.Start can break composition because one can no longer rely on the consuming operation to be complete after it returns.
The API would be like:
type AsyncObserver<'a> = 'a option -> Async<unit>
type AsyncEvent<'a> = AsyncObserver<'a> -> Async<unit>
module AsyncObserver =
val contramapAsync (f:'b -> Async<'a>) (o:AsyncObserver<'a>) : AsyncObserver<'b>
val filterAsync (f:'a -> Async<bool>) (o:AsyncObserver<'a>) : AsyncObserver<'a>
val skipWhile (f:'a -> Async<bool>) (o:AsyncObserver<'a>) : AsyncObserver<'a>
val contrachooseAsync (f:'b -> Async<'a option>) (o:AsyncObserver<'a>) : AsyncObserver<'b>
module AsyncEvent =
val mapAsync (f:'a -> Async<'b>) (o:AsyncEvent<'a>) : AsyncEvent<'b>
val bind (f:'a -> AsyncEvent<'b>) (o:AsyncEvent<'a>) : AsyncEvent<'b>
val filterAsync (f:'a -> Async<bool>) (o:AsyncEvent<'a>) : AsyncEvent<'a>
val merge (o1:AsyncEvent<'a>) (o2:AsyncEvent<'a>) : AsyncEvent<'a>
val ofAsyncSeq (s:AsyncSeq<'a>) : AsyncEvent<'a>
val unfoldAsync (f:'State -> Async<('a * 'State) option>) (s:'State) : AsyncEvent<'a>