reduxr 0.1.3

Redux store with full middleware support
Documentation
pub trait Reduce<Action> {
    fn reduce(self, action: &Action) -> Self;
}

#[cfg(test)]
mod tests {
    use super::*;

    struct LampState {
        power: bool,
    }

    enum LampOnOffAction {
        TurnOn,
        TurnOff,
    }

    impl Reduce<LampOnOffAction> for LampState {
        fn reduce(self, action: &LampOnOffAction) -> Self {
            match action {
                LampOnOffAction::TurnOn => LampState { power: true },
                LampOnOffAction::TurnOff => LampState { power: false },
            }
        }
    }

    enum LampSwitchAction {
        Switch,
    }

    impl Reduce<LampSwitchAction> for LampState {
        fn reduce(self, action: &LampSwitchAction) -> Self {
            match action {
                LampSwitchAction::Switch => LampState { power: !self.power },
            }
        }
    }

    #[test]
    fn reduce_test() {
        let state = LampState { power: false };
        assert_eq!(state.power, false);

        let state = state.reduce(&LampOnOffAction::TurnOn);
        assert_eq!(state.power, true);

        let state = state.reduce(&LampOnOffAction::TurnOff);
        assert_eq!(state.power, false);

        let state = state.reduce(&LampSwitchAction::Switch);
        assert_eq!(state.power, true);

        let state = state.reduce(&LampSwitchAction::Switch);
        assert_eq!(state.power, false);
    }
}