public Logic(QueueSink <T> stage, int maxBuffer) : base(stage.Shape) { _stage = stage; _maxBuffer = maxBuffer; _currentRequest = new Option <TaskCompletionSource <Option <T> > >(); SetHandler(stage.In, this); }
public Logic(QueueSink <T> stage, int maxBuffer) : base(stage.Shape) { _stage = stage; _maxBuffer = maxBuffer; _currentRequest = new Option <TaskCompletionSource <Option <T> > >(); SetHandler(_stage.In, onPush: () => { EnqueueAndNotify(new Result <Option <T> >(Grab(_stage.In))); if (_buffer.Used < _maxBuffer) { Pull(_stage.In); } }, onUpstreamFinish: () => EnqueueAndNotify(new Result <Option <T> >(Option <T> .None)), onUpstreamFailure: ex => EnqueueAndNotify(new Result <Option <T> >(ex))); }