Mercurial > pub > ImplabNet
diff Implab/Promise.cs @ 144:8c0b95069066 v2
DRAFT: refactoring
author | cin |
---|---|
date | Fri, 06 Mar 2015 15:45:26 +0300 |
parents | f75cfa58e3d4 |
children | 8200ab154c8a |
line wrap: on
line diff
--- a/Implab/Promise.cs Wed Mar 04 18:05:39 2015 +0300 +++ b/Implab/Promise.cs Fri Mar 06 15:45:26 2015 +0300 @@ -1,222 +1,22 @@ using System; -using System.Diagnostics; +using Implab.Parallels; namespace Implab { - public class Promise : AbstractPromise<Promise.HandlerDescriptor>, IPromise, IDeferred { - - public struct HandlerDescriptor { - readonly Action m_success; - readonly Action<Exception> m_error; - readonly Action<Exception> m_cancel; - readonly IDeferred m_deferred; - - public HandlerDescriptor(Action success, Action<Exception> error, Action<Exception> cancel, IDeferred deferred) { - m_success = success; - m_error = error; - m_cancel = cancel; - m_deferred = deferred; - } - - public void SignalSuccess() { - if (m_success != null) { - try { - m_success(); - if (m_deferred != null) - m_deferred.Resolve(); - } catch (Exception err) { - SignalError(err); - } - } - } + public class Promise : AbstractPromise, IDeferred { + public static readonly Promise SUCCESS; - public void SignalError(Exception err) { - if (m_error != null) { - try { - m_error(err); - if (m_deferred != null) - m_deferred.Resolve(); - } catch (Exception err2) { - if (m_deferred != null) - m_deferred.Reject(err2); - } - } else { - if (m_deferred != null) - m_deferred.Reject(err); - } - } - - public void SignalCancel(Exception reason) { - if (m_cancel != null) { - try { - m_cancel(reason); - if (m_deferred != null) - m_deferred.Resolve(); - } catch (Exception err) { - SignalError(err); - } - } else if (reason != null && m_error != null) { - try { - m_error(new OperationCanceledException("The operation was canceled.", reason)); - if (m_deferred != null) - m_deferred.Resolve(); - } catch (Exception err) { - SignalError(err); - } - } else { - if (m_deferred != null) - m_deferred.Cancel(reason); - } - } + static Promise() { + SUCCESS = new Promise(); + SUCCESS.Resolve(); } public void Resolve() { - BeginSetResult(); - EndSetResult(); + SetResult(); } public void Reject(Exception error) { SetError(error); } - - #region implemented abstract members of AbstractPromise - - protected override void SignalSuccess(HandlerDescriptor handler) { - handler.SignalSuccess(); - } - - protected override void SignalError(HandlerDescriptor handler, Exception error) { - handler.SignalError(error); - } - - protected override void SignalCancelled(HandlerDescriptor handler, Exception reason) { - handler.SignalCancel(reason); - } - - protected override void Listen(PromiseEventType events, Action handler) { - AddHandler(new HandlerDescriptor( - events.HasFlag(PromiseEventType.Success) ? handler : null, - events.HasFlag(PromiseEventType.Error) ? new Action<Exception>(err => handler()) : null, - events.HasFlag(PromiseEventType.Cancelled) ? new Action<Exception>(reason => handler()) : null, - null - )); - } - - #endregion - - - public Type PromiseType { - get { - return typeof(void); - } - } - - public IPromise Then(Action success, Action<Exception> error, Action<Exception> cancel) { - var promise = new Promise(); - if (success != null) - promise.On(Cancel, PromiseEventType.Cancelled); - - AddHandler(new HandlerDescriptor(success, error, cancel, promise)); - - return promise; - } - - public IPromise Then(Action success, Action<Exception> error) { - return Then(success, error, null); - } - - public IPromise Then(Action success) { - return Then(success, null, null); - } - - public IPromise On(Action success, Action<Exception> error, Action<Exception> cancel) { - AddHandler(new HandlerDescriptor(success, error, cancel, null)); - return this; - } - - public IPromise On(Action success, Action<Exception> error) { - return On(success, error, null); - } - - public IPromise On(Action success) { - return On(success, null, null); - } - - public IPromise On(Action handler, PromiseEventType events) { - return On( - events.HasFlag(PromiseEventType.Success) ? handler : null, - events.HasFlag(PromiseEventType.Error) ? new Action<Exception>(err => handler()) : null, - events.HasFlag(PromiseEventType.Cancelled) ? new Action<Exception>(reason => handler()) : null - ); - } - - public IPromise<T> Cast<T>() { - throw new InvalidCastException(); - } - - public IPromise Chain(Func<IPromise> chained, Func<Exception, IPromise> error, Func<Exception,IPromise> cancel) { - var medium = new Promise(); - - On( - () => { - if (medium.IsCancelled) - return; - if (chained != null) - ConnectPromise(chained(), medium); - }, - ex => { - if (medium.IsCancelled) - return; - if (error != null) { - try { - ConnectPromise(error(ex), medium); - } catch (Exception ex2) { - medium.Reject(ex2); - } - } else { - medium.Reject(ex); - } - }, - reason => { - if (medium.IsCancelled) - return; - if (cancel != null) - ConnectPromise(cancel(reason), medium); - else - medium.Cancel(reason); - } - ); - - if (chained != null) - medium.On(Cancel, PromiseEventType.Cancelled); - - return medium; - } - - static void ConnectPromise(IPromise result, Promise medium) { - if (result != null) { - result.On( - medium.Resolve, - medium.Reject, - medium.Cancel - ); - medium.On(null,null,result.Cancel); - } else { - medium.Reject( - new NullReferenceException( - "The chained asynchronous operation returned" + - " 'null' where the promise instance is expected" - ) - ); - } - } - - public IPromise Chain(Func<IPromise> chained, Func<Exception, IPromise> error) { - return Chain(chained, error, null); - } - - public IPromise Chain(Func<IPromise> chained) { - return Chain(chained, null, null); - } } }