Transition[] events = { Transition.APP_PASSIVE_OPEN, Transition.APP_SEND, Transition.RCV_SYN_ACK };
State state = State.CLOSED;
foreach (Transition @event in events)
state = (state, @event) switch
(State.CLOSED, Transition.APP_PASSIVE_OPEN) => State.LISTEN,
(State.CLOSED, Transition.APP_ACTIVE_OPEN) => State.SYN_SENT,
(State.LISTEN, Transition.RCV_SYN) => State.SYN_RCVD,
(State.LISTEN, Transition.APP_SEND) => State.SYN_SENT,
(State.LISTEN, Transition.APP_CLOSE) => State.CLOSED,
(State.SYN_RCVD, Transition.APP_CLOSE) => State.FIN_WAIT_1,
(State.SYN_RCVD, Transition.RCV_ACK) => State.ESTABLISHED,
(State.SYN_SENT, Transition.RCV_SYN_ACK) => State.SYN_RCVD,
(State.SYN_SENT, Transition.APP_CLOSE) => State.ESTABLISHED,
(State.SYN_SENT, Transition.RCV_ACK) => State.CLOSED,
(State.ESTABLISHED, Transition.APP_CLOSE) => State.FIN_WAIT_1,
(State.ESTABLISHED, Transition.RCV_FIN) => State.CLOSE_WAIT,
(State.FIN_WAIT_1, Transition.RCV_FIN) => State.CLOSING,
(State.FIN_WAIT_1, Transition.RCV_FIN_ACK) => State.TIME_WAIT,
(State.FIN_WAIT_1, Transition.RCV_ACK) => State.FIN_WAIT_2,
(State.CLOSING, Transition.RCV_ACK) => State.TIME_WAIT,
(State.FIN_WAIT_2, Transition.RCV_FIN) => State.TIME_WAIT,
(State.TIME_WAIT, Transition.APP_TIMEOUT) => State.CLOSED,
(State.CLOSE_WAIT, Transition.APP_CLOSE) => State.LAST_ACK,
(State.LAST_ACK, Transition.RCV_ACK) => State.CLOSED,
if (state == State.ERROR)
Console.WriteLine(state);