public static IEnumerable <object> Handle(ReservationState _, RequestTickets command)
        {
            var reservationId = Guid.NewGuid();
            var requestedOn   = DateTime.UtcNow;

            yield return(new TicketsRequested(reservationId, command.TicketId, command.QuantityRequested, requestedOn));
        }
        public static ReservationState Apply(ReservationState state, IEnumerable <object> events)
        {
            foreach (var e in events)
            {
                Apply(state, e);
            }

            return(state);
        }
        private static void Apply(ReservationState state, object @event)
        {
            switch (@event)
            {
            case TicketsRequested e:
                state.Id                = e.ReservationId;
                state.Status            = ReservationStatus.Requested;
                state.TicketId          = e.TicketId;
                state.QuantityRequested = e.QuantityRequested;
                break;

            case ReservationRejected _:
                state.Status = ReservationStatus.Rejected;
                break;

            case ReservationConfirmed e:
                state.Status           = ReservationStatus.Confirmed;
                state.QuantityReserved = e.QuantityReserved;
                break;
            }
        }
        public static IEnumerable <object> Handle(ReservationState state, RejectReservation _)
        {
            var rejectedOn = DateTime.UtcNow;

            yield return(new ReservationRejected(state.Id, state.TicketId, state.QuantityRequested, rejectedOn));
        }
        public static IEnumerable <object> Handle(ReservationState state, ConfirmReservation _)
        {
            var confirmedOn = DateTime.UtcNow;

            yield return(new ReservationConfirmed(state.Id, state.TicketId, state.QuantityReserved, confirmedOn));
        }