public AttendantsReadModel When(AttendantsReadModel state, object @event) { switch (@event) { case Events.MeetupCreated created: state.MeetupId = created.MeetupId; break; case Events.NumberOfSeatsUpdated seats: state.MeetupCapacity = seats.NumberOfSeats; break; case Events.RSVPAccepted accepted: if (state.MeetupCapacity > state.Going.Count) { state.Going.Add(accepted.MemberId); } else { state.Waiting.Add(accepted.MemberId); } break; case Events.RSVPDeclined declined: state.Going.Remove(declined.MemberId); state.NotGoing.Add(declined.MemberId); UpdateWaitingList(); break; } void UpdateWaitingList() { if (state.MeetupCapacity > state.Going.Count) { var first = state.Waiting.First(); state.Going.Add(first); state.Waiting.Remove(first); } } return(state); }
public AttendantsReadModel Project(AttendantsReadModel readModel, params object[] events) => events.Aggregate(readModel, When);