public void Accept(byte[] bytes)
        {
            var bytesToRead = _remainingBytes.Concat(bytes).ToArray();

            while (!_currentStateWorker.Done && bytesToRead.Length > 0)
            {
                var worker    = _currentStateWorker;
                var bytesRead = _currentStateWorker.Accept(bytesToRead);

                bytesToRead     = bytesToRead.Skip(bytesRead).ToArray();
                _remainingBytes = bytesToRead;

                if (worker.Done)
                {
                    worker.ApplyContent(ref _content);

                    var next = worker.NextWorker;
                    if (next != null)
                    {
                        _currentStateWorker = next;
                    }
                    else
                    {
                        _messages.Enqueue(_content);
                        ResetStateWorker();
                    }
                }
                else
                {
                    Debug.Assert(bytesToRead.Length <= bytesRead);
                }
            }
        }
            protected void FlagAsDone(FeedStateWorker next = null)
            {
                Debug.Assert(next != this);

                if (next != null)
                {
                    next.Reset();
                }

                Done       = true;
                NextWorker = next;
            }
 protected void ResetStateWorker()
 {
     _currentStateWorker = _initialStateFactory();
     _content            = new MessageContent();
 }