public Logic(ActorRefBackpressureSinkStage <TIn> stage, int maxBuffer) : base(stage.Shape)
            {
                _stage     = stage;
                _ackType   = _stage._ackMessage.GetType();
                _maxBuffer = maxBuffer;

                _buffer = new List <TIn>();

                SetHandler(_stage._inlet, this);
            }
            public Logic(ActorRefBackpressureSinkStage <TIn> stage, int maxBuffer) : base(stage.Shape)
            {
                _stage     = stage;
                _ackType   = _stage._ackMessage.GetType();
                _maxBuffer = maxBuffer;

                _buffer = new List <TIn>();

                SetHandler(_stage._inlet, onPush: () =>
                {
                    _buffer.Add(Grab(_stage._inlet));
                    if (_acknowledgementReceived)
                    {
                        DequeueAndSend();
                        _acknowledgementReceived = false;
                    }
                    if (_buffer.Count < maxBuffer)
                    {
                        Pull(stage._inlet);
                    }
                }, onUpstreamFinish: () =>
                {
                    if (_buffer.Count == 0)
                    {
                        Finish();
                    }
                    else
                    {
                        _completeReceived = true;
                    }
                }, onUpstreamFailure: ex =>
                {
                    stage._actorRef.Tell(stage._onFailureMessage(ex), _self);
                    FailStage(ex);
                });
            }