FSharpx.Async icon indicating copy to clipboard operation
FSharpx.Async copied to clipboard

AsyncEvent?

Open eulerfx opened this issue 10 years ago • 0 comments

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>

eulerfx avatar Feb 24 '15 00:02 eulerfx