WindowsObservable
Provides a set of static methods for importing typed events from Windows Runtime APIs.
using System.Reactive.Windows.Foundation;
using Windows.Foundation;
namespace System.Reactive.Linq
{
[CLSCompliant(false)]
public static class WindowsObservable
{
public unsafe static IObservable<EventPattern<TSender, TResult>> FromEventPattern<TSender, TResult>(Action<TypedEventHandler<TSender, TResult>> addHandler, Action<TypedEventHandler<TSender, TResult>> removeHandler)
{
if (addHandler == null)
throw new ArgumentNullException("addHandler");
if (removeHandler == null)
throw new ArgumentNullException("removeHandler");
return Observable.Create<EventPattern<TSender, TResult>>(delegate {
<>c__DisplayClass0_1<TSender, TResult> <>c__DisplayClass0_;
TypedEventHandler<TSender, TResult> h = new TypedEventHandler<TSender, TResult>((object)<>c__DisplayClass0_, (IntPtr)(void*));
addHandler(h);
return delegate {
removeHandler(h);
};
});
}
public unsafe static IObservable<EventPattern<TSender, TResult>> FromEventPattern<TDelegate, TSender, TResult>(Func<TypedEventHandler<TSender, TResult>, TDelegate> conversion, Action<TDelegate> addHandler, Action<TDelegate> removeHandler)
{
if (conversion == null)
throw new ArgumentNullException("conversion");
if (addHandler == null)
throw new ArgumentNullException("addHandler");
if (removeHandler == null)
throw new ArgumentNullException("removeHandler");
return Observable.Create<EventPattern<TSender, TResult>>(delegate {
<>c__DisplayClass1_1<TDelegate, TSender, TResult> <>c__DisplayClass1_;
TDelegate h = (TDelegate)conversion(new TypedEventHandler<TResult, ?>((object)<>c__DisplayClass1_, (IntPtr)(void*)));
addHandler((TDelegate)h);
return delegate {
removeHandler((TDelegate)h);
};
});
}
public static IEventPatternSource<TSender, TEventArgs> ToEventPattern<TSender, TEventArgs>(this IObservable<EventPattern<TSender, TEventArgs>> source)
{
if (source == null)
throw new ArgumentNullException("source");
return new EventPatternSource<TSender, TEventArgs>(source, (Action<Action<TSender, TEventArgs>, EventPattern<TSender, TEventArgs>>)delegate(Action<TSender, TEventArgs> h, EventPattern<TSender, TEventArgs> evt) {
h(evt.Sender, evt.EventArgs);
});
}
public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IAsyncOperation<TResult>> selector)
{
if (source == null)
throw new ArgumentNullException("source");
if (selector == null)
throw new ArgumentNullException("selector");
return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TResult>(selector(x)));
}
public static IObservable<TResult> SelectMany<TSource, TResult, TProgress>(this IObservable<TSource> source, Func<TSource, IAsyncOperationWithProgress<TResult, TProgress>> selector)
{
if (source == null)
throw new ArgumentNullException("source");
if (selector == null)
throw new ArgumentNullException("selector");
return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TResult, TProgress>(selector(x)));
}
public static IObservable<TResult> SelectMany<TSource, TAsyncOperationResult, TResult>(this IObservable<TSource> source, Func<TSource, IAsyncOperation<TAsyncOperationResult>> asyncOperationSelector, Func<TSource, TAsyncOperationResult, TResult> resultSelector)
{
if (source == null)
throw new ArgumentNullException("source");
if (asyncOperationSelector == null)
throw new ArgumentNullException("asyncOperationSelector");
if (resultSelector == null)
throw new ArgumentNullException("resultSelector");
return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TAsyncOperationResult>(asyncOperationSelector(x)), resultSelector);
}
public static IObservable<TResult> SelectMany<TSource, TAsyncOperationResult, TAsyncOperationProgress, TResult>(this IObservable<TSource> source, Func<TSource, IAsyncOperationWithProgress<TAsyncOperationResult, TAsyncOperationProgress>> asyncOperationSelector, Func<TSource, TAsyncOperationResult, TResult> resultSelector)
{
if (source == null)
throw new ArgumentNullException("source");
if (asyncOperationSelector == null)
throw new ArgumentNullException("asyncOperationSelector");
if (resultSelector == null)
throw new ArgumentNullException("resultSelector");
return source.SelectMany((TSource x) => AsyncInfoObservableExtensions.ToObservable<TAsyncOperationResult, TAsyncOperationProgress>(asyncOperationSelector(x)), resultSelector);
}
}
}