public Logic(QueueSource <TOut> stage, TaskCompletionSource <object> completion) : base(stage.Shape) { _completion = completion; _stage = stage; SetHandler(stage.Out, this); }
public Logic(QueueSource <TOut> source) : base(source.Shape) { _source = source; SetHandler(source.Shape.Outlet, onDownstreamFinish: () => { if (_pendingOffer != null) { var promise = _pendingOffer.Item2; promise.SetResult(QueueOfferResult.QueueClosed.Instance); _pendingOffer = null; } _source._completion.SetResult(new object()); CompleteStage(); }, onPull: () => { if (_source._maxBuffer == 0) { if (_pendingOffer != null) { var element = _pendingOffer.Item1; var promise = _pendingOffer.Item2; Push(source.Shape.Outlet, element); promise.SetResult(QueueOfferResult.Enqueued.Instance); _pendingOffer = null; } else { _pulled = true; } } else if (!_buffer.IsEmpty) { Push(source.Shape.Outlet, _buffer.Dequeue()); if (_pendingOffer != null) { var element = _pendingOffer.Item1; var promise = _pendingOffer.Item2; EnqueueAndSuccess(element, promise); } } else { _pulled = true; } }); }
public Logic(QueueSource <TOut> source, TaskCompletionSource <object> completion) : base(source.Shape) { _completion = completion; _source = source; SetHandler(source.Out, onDownstreamFinish: () => { if (_pendingOffer != null) { _pendingOffer.CompletionSource.SetResult(QueueOfferResult.QueueClosed.Instance); _pendingOffer = null; } _completion.SetResult(new object()); CompleteStage(); }, onPull: () => { if (_source._maxBuffer == 0) { if (_pendingOffer != null) { Push(source.Out, _pendingOffer.Element); _pendingOffer.CompletionSource.SetResult(QueueOfferResult.Enqueued.Instance); _pendingOffer = null; if (_terminating) { _completion.SetResult(new object()); CompleteStage(); } } } else if (_buffer.NonEmpty) { Push(source.Out, _buffer.Dequeue()); if (_pendingOffer != null) { EnqueueAndSuccess(_pendingOffer); _pendingOffer = null; } } if (_terminating && _buffer.IsEmpty) { _completion.SetResult(new object()); CompleteStage(); } }); }
public Materialized(QueueSource <TOut> source, Action <Tuple <TOut, Offered> > invokeLogic) { _source = source; _invokeLogic = invokeLogic; }