AbstractPromise.cs
140 lines
| 4.4 KiB
| text/x-csharp
|
CSharpLexer
/ Implab / AbstractPromise.cs
|
|
r119 | using System; | ||
| using Implab.Parallels; | ||||
| namespace Implab { | ||||
|
|
r144 | public abstract class AbstractPromise : AbstractEvent<AbstractPromise.HandlerDescriptor>, IPromise { | ||
| public struct HandlerDescriptor { | ||||
| readonly Action m_handler; | ||||
| readonly Action<Exception> m_error; | ||||
| readonly Action<Exception> m_cancel; | ||||
| readonly PromiseEventType m_mask; | ||||
|
|
r119 | |||
|
|
r144 | public HandlerDescriptor(Action success, Action<Exception> error, Action<Exception> cancel) { | ||
| m_handler = success; | ||||
| m_error = error; | ||||
| m_cancel = cancel; | ||||
| m_mask = PromiseEventType.Success; | ||||
| } | ||||
|
|
r125 | |||
|
|
r144 | public HandlerDescriptor(Action handler, PromiseEventType mask) { | ||
| m_handler = handler; | ||||
|
|
r145 | m_error = null; | ||
| m_cancel = null; | ||||
|
|
r144 | m_mask = mask; | ||
| } | ||||
|
|
r119 | |||
|
|
r144 | public void SignalSuccess() { | ||
|
|
r145 | if ((m_mask & PromiseEventType.Success) != 0 && m_handler != null) { | ||
|
|
r144 | try { | ||
| m_handler(); | ||||
|
|
r197 | // Analysis disable once EmptyGeneralCatchClause | ||
| } catch { | ||||
|
|
r144 | } | ||
| } | ||||
| } | ||||
|
|
r119 | |||
|
|
r144 | public void SignalError(Exception err) { | ||
| if (m_error != null) { | ||||
| try { | ||||
| m_error(err); | ||||
| // Analysis disable once EmptyGeneralCatchClause | ||||
| } catch { | ||||
| } | ||||
|
|
r145 | } else if ((m_mask & PromiseEventType.Error ) != 0 && m_handler != null) { | ||
|
|
r144 | try { | ||
| m_handler(); | ||||
| // Analysis disable once EmptyGeneralCatchClause | ||||
| } catch { | ||||
| } | ||||
| } | ||||
|
|
r119 | } | ||
|
|
r144 | public void SignalCancel(Exception reason) { | ||
| if (m_cancel != null) { | ||||
| try { | ||||
| m_cancel(reason); | ||||
|
|
r197 | // Analysis disable once EmptyGeneralCatchClause | ||
| } catch { | ||||
|
|
r144 | } | ||
|
|
r145 | } else if ( (m_mask & PromiseEventType.Cancelled) != 0 && m_handler != null) { | ||
|
|
r144 | try { | ||
| m_handler(); | ||||
| // Analysis disable once EmptyGeneralCatchClause | ||||
| } catch { | ||||
| } | ||||
| } | ||||
|
|
r119 | } | ||
| } | ||||
|
|
r144 | #region implemented abstract members of AbstractPromise | ||
|
|
r119 | |||
|
|
r156 | protected override void SignalHandler(HandlerDescriptor handler, int signal) { | ||
| switch (signal) { | ||||
| case SUCCEEDED_STATE: | ||||
| handler.SignalSuccess(); | ||||
| break; | ||||
| case REJECTED_STATE: | ||||
| handler.SignalError(Error); | ||||
| break; | ||||
| case CANCELLED_STATE: | ||||
| handler.SignalCancel(CancellationReason); | ||||
| break; | ||||
| default: | ||||
| throw new InvalidOperationException(String.Format("Invalid promise signal: {0}", signal)); | ||||
| } | ||||
|
|
r119 | } | ||
|
|
r144 | protected override Signal GetResolveSignal() { | ||
| var signal = new Signal(); | ||||
| On(signal.Set, PromiseEventType.All); | ||||
|
|
r145 | return signal; | ||
|
|
r119 | } | ||
| #endregion | ||||
|
|
r144 | public Type PromiseType { | ||
| get { | ||||
| return typeof(void); | ||||
|
|
r119 | } | ||
| } | ||||
|
|
r144 | public IPromise On(Action success, Action<Exception> error, Action<Exception> cancel) { | ||
| AddHandler(new HandlerDescriptor(success, error, cancel)); | ||||
| return this; | ||||
| } | ||||
| public IPromise On(Action success, Action<Exception> error) { | ||||
| AddHandler(new HandlerDescriptor(success, error, null)); | ||||
| return this; | ||||
|
|
r119 | } | ||
|
|
r144 | public IPromise On(Action success) { | ||
| AddHandler(new HandlerDescriptor(success, null, null)); | ||||
| return this; | ||||
| } | ||||
|
|
r119 | |||
|
|
r144 | public IPromise On(Action handler, PromiseEventType events) { | ||
| AddHandler(new HandlerDescriptor(handler,events)); | ||||
| return this; | ||||
| } | ||||
|
|
r119 | |||
|
|
r144 | public IPromise<T> Cast<T>() { | ||
| throw new InvalidCastException(); | ||||
|
|
r119 | } | ||
| public void Join() { | ||||
| WaitResult(-1); | ||||
| } | ||||
|
|
r144 | public void Join(int timeout) { | ||
| WaitResult(timeout); | ||||
|
|
r119 | } | ||
|
|
r144 | protected void SetResult() { | ||
|
|
r186 | if(BeginSetResult()) | ||
| EndSetResult(); | ||||
|
|
r138 | } | ||
|
|
r119 | } | ||
| } | ||||
