Example #1
0
        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);
        }
Example #2
0
        public static LightSwitchStateMachine PowersDownTheLight(LightSwitchStateMachine arg)
        {
            var result = arg.PowerUpLight(); //impure

            return(new LightSwitchStateMachine(LightSwitchState.SwitchedOn,
                                               arg.NumSwitches + 1,
                                               arg.PowerUpLight,
                                               arg.PowerDownLight));
        }
Example #3
0
        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();
            }
        }
Example #4
0
 public static LightSwitchStateMachine DoesNothing(LightSwitchStateMachine arg)
 {
     return(arg);
 }