public async Task Buffers_Ok()
        {
            var postbox  = new CommandPostbox();
            var commands = Enumerable
                           .Range(0, 5)
                           .Select(i => new CommandDto(i.ToString(), ""));

            async Task Post()
            {
                foreach (var command in commands)
                {
                    var reply = await postbox.Post(command);

                    Assert.Equal(reply, command.Type);
                }
            }

            var tokenSource = new CancellationTokenSource();

            async Task Process()
            {
                await foreach (var(c, reply) in postbox.Read(tokenSource.Token))
                {
                    reply(c.Type);

                    if (c.Type == "4")
                    {
                        return;
                    }
                }
            }

            await Task.WhenAll(Post(), Process());
        }
 public CommandService(
     CommandPostbox postbox,
     IEventRepository repository,
     IStateRepository stateRepository,
     ILogger <CommandService> logger)
 {
     _postbox         = postbox ?? throw new ArgumentNullException(nameof(postbox));
     _eventRepository = repository ?? throw new ArgumentNullException(nameof(repository));
     _stateRepository = stateRepository ?? throw new ArgumentNullException(nameof(stateRepository));
     _logger          = logger ?? throw new ArgumentNullException(nameof(logger));
     _state           = Domain.StateModule.empty;
 }
        public async Task Replies_Ok()
        {
            var postbox     = new CommandPostbox();
            var command     = new CommandDto("123", "");
            var postTask    = postbox.Post(command);
            var tokenSource = new CancellationTokenSource();

            async Task <string> Process()
            {
                await foreach (var(c, reply) in postbox.Read(tokenSource.Token))
                {
                    reply(c.Type);
                    return(c.Body);
                }

                return("");
            }

            var results = await Task.WhenAll(postTask, Process());

            Assert.Equal("123", results[0]);
        }