Skip to content

Instantly share code, notes, and snippets.

@khmylov
Created April 25, 2012 22:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save khmylov/2494178 to your computer and use it in GitHub Desktop.
Save khmylov/2494178 to your computer and use it in GitHub Desktop.
Compose asynchronous sequential workflows from EAP operations.
public static IObservable<TResult> SelectFromAsyncEventPattern
<TSource, TResult, TDelegate, TEventArgs>(
this IEnumerable<TSource> source,
Action<TSource> run,
Func<EventHandler<TEventArgs>, TDelegate> conversion,
Action<TDelegate> subscribe,
Action<TDelegate> unsubscribe,
Func<TEventArgs, TResult> mapResult,
Func<TEventArgs, Exception> mapException)
where TEventArgs: EventArgs
{
var enumerator = source.GetEnumerator();
var subject = new Subject<TResult>();
var convertedHandler = default(TDelegate);
Action takeNext = () =>
{
if (enumerator.MoveNext())
{
run(enumerator.Current);
}
else
{
subject.OnCompleted();
unsubscribe(convertedHandler);
}
};
EventHandler<TEventArgs> handler = (s, e) =>
{
var exception = mapException(e);
if (exception != null)
{
subject.OnError(exception);
unsubscribe(convertedHandler);
}
else
{
var result = mapResult(e);
subject.OnNext(result);
takeNext();
}
};
convertedHandler = conversion(handler);
subscribe(convertedHandler);
takeNext();
return subject;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment