public IDisposable Run() { var ls = new SingleAssignmentDisposable(); var rs = new SingleAssignmentDisposable(); var d = StableCompositeDisposable.Create(ls, rs); var gate = new object(); var lo = new AmbObserver(); lo._disposable = d; lo._target = new DecisionObserver(this, gate, AmbState.Left, ls, rs, lo); var ro = new AmbObserver(); ro._disposable = d; ro._target = new DecisionObserver(this, gate, AmbState.Right, rs, ls, ro); _choice = AmbState.Neither; ls.Disposable = _parent._left.SubscribeSafe(lo); rs.Disposable = _parent._right.SubscribeSafe(ro); return(d); }
/// <summary> /// The core code in class Amb. How it can propagate the observable sequence that reacts first? /// Because of the lazy evaluation of C#, it will only execute when the code runs into SubscribeSafe. /// SubscribeSafe takes an observer as a parameter which will initialize only when called. /// In the procedure of parameter initializing, other observable resoures will dispose, only left the reacted one. /// </summary> /// <returns></returns> public IDisposable Run() { var ls = new SingleAssignmentDisposable(); var rs = new SingleAssignmentDisposable(); var d = new CompositeDisposable(ls, rs); // Initializes a new instance of the System.Object class. var gate = new object(); // Initialize all observers. var lo = new AmbObserver(); lo._disposable = d; // Initialize a instance of DecisionObserver class. lo._target = new DecisionObserver(this, gate, AmbState.Left, ls, rs, lo); var ro = new AmbObserver(); ro._disposable = d; ro._target = new DecisionObserver(this, gate, AmbState.Right, rs, ls, ro); //Initialize the Enum state to Neither. _choice = AmbState.Neither; // Observers subscribe the resource. ls.Disposable = _parent._left.SubscribeSafe(lo); rs.Disposable = _parent._right.SubscribeSafe(ro); return(d); }
public DecisionObserver(_ parent, object gate, AmbState me, IDisposable subscription, IDisposable otherSubscription, AmbObserver observer) { _parent = parent; _gate = gate; _me = me; _subscription = subscription; _otherSubscription = otherSubscription; _observer = observer; }
internal AmbDisposable(ICompletableObserver downstream, int n) { this.downstream = downstream; var o = new AmbObserver[n]; for (int i = 0; i < n; i++) { o[i] = new AmbObserver(this, i); } observers = o; Volatile.Write(ref index, -1); }
public AmbCoordinator(IObserver <TSource> observer) { _leftObserver = new AmbObserver(observer, this, true); _rightObserver = new AmbObserver(observer, this, false); }