Mercurial > pub > ImplabNet
annotate Implab/AbstractPromise.cs @ 244:eee3e49dd1ff v3
working on promises
| author | cin | 
|---|---|
| date | Thu, 25 Jan 2018 19:09:16 +0300 | 
| parents | b1e0ffdf3451 | 
| children | fb70574741a1 | 
| rev | line source | 
|---|---|
| 119 | 1 using System; | 
| 243 | 2 using System.Diagnostics; | 
| 3 using System.Reflection; | |
| 119 | 4 using Implab.Parallels; | 
| 5 | |
| 6 namespace Implab { | |
| 244 | 7 public class AbstractPromise : AbstractEvent<IResolvable>, IPromise { | 
| 243 | 8 | 
| 244 | 9 class ResolvableSignal : IResolvable { | 
| 10 public Signal Signal { get; private set; } | |
| 11 public ResolvableSignal() { | |
| 12 Signal = new Signal(); | |
| 144 | 13 } | 
| 119 | 14 | 
| 244 | 15 | 
| 16 public void Reject(Exception error) { | |
| 17 Signal.Set(); | |
| 144 | 18 } | 
| 119 | 19 | 
| 244 | 20 public void Resolve() { | 
| 21 Signal.Set(); | |
| 119 | 22 } | 
| 23 } | |
| 24 | |
| 243 | 25 PromiseState m_state; | 
| 26 | |
| 27 Exception m_error; | |
| 28 | |
| 29 public bool IsRejected { | |
| 30 get { | |
| 31 return m_state == PromiseState.Rejected; | |
| 32 } | |
| 33 } | |
| 34 | |
| 244 | 35 public bool IsFulfilled { | 
| 243 | 36 get { | 
| 244 | 37 return m_state == PromiseState.Fulfilled; | 
| 243 | 38 } | 
| 39 } | |
| 40 | |
| 41 public Exception RejectReason { | |
| 42 get { | |
| 43 return m_error; | |
| 44 } | |
| 45 } | |
| 46 | |
| 119 | 47 | 
| 244 | 48 internal void Resolve() { | 
| 49 if (BeginTransit()) | |
| 50 CompleteResolve(); | |
| 51 } | |
| 52 | |
| 53 internal void Reject(Exception reason) { | |
| 54 if (BeginTransit()) { | |
| 55 m_error = reason; | |
| 56 m_state = PromiseState.Rejected; | |
| 57 CompleteTransit(); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 | |
| 144 | 62 #region implemented abstract members of AbstractPromise | 
| 119 | 63 | 
| 244 | 64 protected override void SignalHandler(IResolvable handler) { | 
| 243 | 65 switch (m_state) { | 
| 244 | 66 case PromiseState.Fulfilled: | 
| 67 handler.Resolve(); | |
| 156 
97fbbf816844
Promises: SignalXXX methods merged into SignalHandler method.
 cin parents: 
145diff
changeset | 68 break; | 
| 243 | 69 case PromiseState.Rejected: | 
| 244 | 70 handler.Reject(RejectReason); | 
| 156 
97fbbf816844
Promises: SignalXXX methods merged into SignalHandler method.
 cin parents: 
145diff
changeset | 71 break; | 
| 
97fbbf816844
Promises: SignalXXX methods merged into SignalHandler method.
 cin parents: 
145diff
changeset | 72 default: | 
| 243 | 73 throw new InvalidOperationException(String.Format("Invalid promise signal: {0}", m_state)); | 
| 156 
97fbbf816844
Promises: SignalXXX methods merged into SignalHandler method.
 cin parents: 
145diff
changeset | 74 } | 
| 119 | 75 } | 
| 76 | |
| 242 | 77 protected override Signal GetFulfillSignal() { | 
| 244 | 78 var next = new ResolvableSignal(); | 
| 79 Then(next); | |
| 80 return next.Signal; | |
| 119 | 81 } | 
| 82 | |
| 83 #endregion | |
| 84 | |
| 243 | 85 protected void CompleteResolve() { | 
| 244 | 86 m_state = PromiseState.Fulfilled; | 
| 243 | 87 CompleteTransit(); | 
| 88 } | |
| 89 | |
| 242 | 90 public Type ResultType { | 
| 144 | 91 get { | 
| 92 return typeof(void); | |
| 119 | 93 } | 
| 94 } | |
| 95 | |
| 243 | 96 | 
| 97 protected void Rethrow() { | |
| 98 Debug.Assert(m_error != null); | |
| 99 if (m_error is OperationCanceledException) | |
| 100 throw new OperationCanceledException("Operation cancelled", m_error); | |
| 101 else | |
| 102 throw new TargetInvocationException(m_error); | |
| 103 } | |
| 104 | |
| 244 | 105 public void Then(IResolvable next) { | 
| 106 AddHandler(next); | |
| 144 | 107 } | 
| 119 | 108 | 
| 144 | 109 public IPromise<T> Cast<T>() { | 
| 110 throw new InvalidCastException(); | |
| 119 | 111 } | 
| 112 | |
| 113 public void Join() { | |
| 114 WaitResult(-1); | |
| 243 | 115 if (IsRejected) | 
| 116 Rethrow(); | |
| 119 | 117 } | 
| 118 | |
| 144 | 119 public void Join(int timeout) { | 
| 120 WaitResult(timeout); | |
| 119 | 121 } | 
| 122 } | |
| 123 } | |
| 124 | 
