1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use std::cell::RefCell; use std::rc::Rc; use std::ops::{Add, Sub}; use super::{IncrBy, DecrBy}; use super::action::{TypedAction, Action, ParseResult}; use super::action::ParseResult::Parsed; use super::action::IFlagAction; use super::action::Action::Flag; pub struct IncrByAction<'a, T: 'a> { delta: T, cell: Rc<RefCell<&'a mut T>>, } pub struct DecrByAction<'a, T: 'a> { delta: T, cell: Rc<RefCell<&'a mut T>>, } impl<T: 'static + Add<Output = T> + Copy> TypedAction<T> for IncrBy<T> { fn bind<'x>(&self, cell: Rc<RefCell<&'x mut T>>) -> Action<'x> { let IncrBy(delta) = *self; return Flag(Box::new(IncrByAction { cell: cell, delta: delta })); } } impl<T: 'static + Sub<Output = T> + Copy> TypedAction<T> for DecrBy<T> { fn bind<'x>(&self, cell: Rc<RefCell<&'x mut T>>) -> Action<'x> { let DecrBy(delta) = *self; return Flag(Box::new(DecrByAction { cell: cell, delta: delta })); } } impl<'a, T: Add<Output = T> + Copy> IFlagAction for IncrByAction<'a, T> { fn parse_flag(&self) -> ParseResult { let mut targ = self.cell.borrow_mut(); let oldval = **targ; **targ = oldval + self.delta; return Parsed; } } impl<'a, T: Sub<Output = T> + Copy> IFlagAction for DecrByAction<'a, T> { fn parse_flag(&self) -> ParseResult { let mut targ = self.cell.borrow_mut(); let oldval = **targ; **targ = oldval - self.delta; return Parsed; } }