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>, } pub struct DecrByAction<'a, T: 'a> { delta: T, cell: Rc>, } impl + Clone> TypedAction for IncrBy { fn bind<'x>(&self, cell: Rc>) -> Action<'x> { let IncrBy(ref delta) = *self; return Flag(Box::new(IncrByAction { cell: cell, delta: delta.clone() })); } } impl + Clone> TypedAction for DecrBy { fn bind<'x>(&self, cell: Rc>) -> Action<'x> { let DecrBy(ref delta) = *self; return Flag(Box::new(DecrByAction { cell: cell, delta: delta.clone() })); } } impl<'a, T: Add + Clone> IFlagAction for IncrByAction<'a, T> { fn parse_flag(&self) -> ParseResult { let oldval = { let targ = self.cell.borrow(); targ.clone() }; let mut targ = self.cell.borrow_mut(); **targ = oldval + self.delta.clone(); return Parsed; } } impl<'a, T: Sub + Clone> IFlagAction for DecrByAction<'a, T> { fn parse_flag(&self) -> ParseResult { let oldval = { let targ = self.cell.borrow(); targ.clone() }; let mut targ = self.cell.borrow_mut(); **targ = oldval - self.delta.clone(); return Parsed; } }