using System; using System.Diagnostics; namespace Implab { class PromiseActionReaction : PromiseReaction { readonly Action m_fulfilled; readonly Action m_rejected; readonly Deferred m_next; public PromiseActionReaction(Action fulfilled, Action rejected, Deferred next, IDispatcher dispatcher) : base(dispatcher) { if (fulfilled != null) m_fulfilled = (x) => { fulfilled(x); next.Resolve(); }; if (rejected != null) m_rejected = (x) => { rejected(x); next.Resolve(); }; m_next = next; } public PromiseActionReaction(Func fulfilled, Func rejected, Deferred next, IDispatcher dispatcher) : base(dispatcher) { if (fulfilled != null) m_fulfilled = (x) => { next.Resolve(fulfilled(x)); }; if (rejected != null) m_rejected = (e) => { next.Resolve(rejected(e)); }; m_next = next; } public PromiseActionReaction(Action fulfilled, Func rejected, Deferred next, IDispatcher dispatcher) : base(dispatcher) { if (fulfilled != null) m_fulfilled = (x) => { fulfilled(x); next.Resolve(); }; if (rejected != null) m_rejected = (e) => { next.Resolve(rejected(e)); }; m_next = next; } public PromiseActionReaction(Func fulfilled, Action rejected, Deferred next, IDispatcher dispatcher) : base(dispatcher) { if (fulfilled != null) m_fulfilled = (x) => { next.Resolve(fulfilled(x)); }; if (rejected != null) m_rejected = (x) => { rejected(x); next.Resolve(); }; m_next = next; } protected override bool HasFulfilHandler => m_fulfilled != null; protected override bool HasRejectHandler => m_rejected != null; protected override void DefaultReject(Exception reason) { m_next.Reject(reason); } protected override void DefaultResolve(T result) { m_next.Resolve(); } protected override void RejectImpl(Exception reason) { try { m_rejected(reason); } catch (Exception e) { m_next.Reject(e); } } protected override void ResolveImpl(T result) { try { m_fulfilled(result); } catch (Exception e) { m_next.Reject(e); } } } }