using System.Threading; using System; #if NET_4_5 using System.Threading.Tasks; #endif namespace Implab { public static class PromiseExtensions { public static IPromise DispatchToCurrentContext(this IPromise that) { Safe.ArgumentNotNull(that, "that"); var context = SynchronizationContext.Current; if (context == null) return that; var p = new SyncContextPromise(context, that, true); that.Last( p.Resolve, p.Reject, p.Cancel ); return p; } public static IPromise DispatchToContext(this IPromise that, SynchronizationContext context) { Safe.ArgumentNotNull(that, "that"); Safe.ArgumentNotNull(context, "context"); var p = new SyncContextPromise(context, that, true); that.Last( p.Resolve, p.Reject, p.Cancel ); return p; } public static AsyncCallback AsyncCallback(this Promise that, Func callback) { Safe.ArgumentNotNull(that, "that"); Safe.ArgumentNotNull(callback, "callback"); return ar => { try { that.Resolve(callback(ar)); } catch (Exception err) { that.Reject(err); } }; } #if NET_4_5 public static Task GetTask(this IPromise that) { Safe.ArgumentNotNull(that, "that"); var tcs = new TaskCompletionSource(); that.Last(tcs.SetResult, tcs.SetException, tcs.SetCanceled); return tcs.Task; } #endif } }