public AttendeesListReadModel Project(AttendeesListReadModel readModel, params object[] events)
 {
     foreach (var ev in events)
     {
         readModel = When(readModel, ev);
     }
     return(readModel);
 }
        private AttendeesListReadModel When(AttendeesListReadModel readModel, object ev)
        {
            switch (ev)
            {
            case Events.MeetupCreated created:
                readModel.Id = created.MeetupId;
                break;

            case Events.NumberOfSeatsUpdated seats:
                readModel.MeetupCapacity = seats.NumberOfSeats;
                break;

            case Events.RSVPAccepted accepted:
                if (readModel.MeetupFull)
                {
                    readModel.WaitingList.Add(accepted.MemberId);
                }
                else
                {
                    readModel.MembersGoing.Add(accepted.MemberId);
                }
                break;

            case Events.RSVPDeclined declined:
                readModel.MembersNotGoing.Add(declined.MemberId);

                if (readModel.MembersGoing.Contains(declined.MemberId))
                {
                    if (readModel.WaitingList.Count() > 0)
                    {
                        var memberWaiting = readModel.WaitingList.First();
                        readModel.MembersGoing.Add(memberWaiting);
                        readModel.WaitingList.Remove(memberWaiting);
                    }

                    readModel.MembersGoing.Remove(declined.MemberId);
                }

                break;
            }

            return(readModel);
        }