public static void Main(string[] args) { var consoleOutput = new ConsoleOutput(); var light = new DiningRoomLight(); var powerUpLight = new Func <object>(() => PowerUpLight(light)); var powerDownLight = new Func <object>(() => PowerDownLight(light)); var machine = new LightSwitchStateMachine(LightSwitchState.SwitchedOff, 0, powerUpLight, powerDownLight); machine = DispatchSignalTo(machine, whenSwitchedOn: SwitchedOnSignal.DoesNothing, whenSwitchedOff: SwitchedOnSignal.PowersDownTheLight ); machine = DispatchSignalTo(machine, SwitchedOffSignal.PowersDownTheLight, SwitchedOffSignal.DoesNothing ); machine = DispatchSignalTo(machine, whenSwitchedOn: SwitchedOffSignal.PowersDownTheLight, whenSwitchedOff: SwitchedOffSignal.DoesNothing ); var whatever = ShowOutput(consoleOutput, machine.NumSwitches); }
public static LightSwitchStateMachine PowersDownTheLight(LightSwitchStateMachine arg) { var result = arg.PowerUpLight(); //impure return(new LightSwitchStateMachine(LightSwitchState.SwitchedOn, arg.NumSwitches + 1, arg.PowerUpLight, arg.PowerDownLight)); }
public static LightSwitchStateMachine DispatchSignalTo( LightSwitchStateMachine machine, Func <LightSwitchStateMachine, LightSwitchStateMachine> whenSwitchedOn, Func <LightSwitchStateMachine, LightSwitchStateMachine> whenSwitchedOff) { switch (machine.CurrentState) { case LightSwitchState.SwitchedOn: return(whenSwitchedOn(machine)); case LightSwitchState.SwitchedOff: return(whenSwitchedOff(machine)); default: throw new ArgumentOutOfRangeException(); } }
public static LightSwitchStateMachine DoesNothing(LightSwitchStateMachine arg) { return(arg); }