use crate::*; fn sum_of(values: Vec) -> Result { if values.is_empty() { return Ok(Outcome::Scalar(0)); } let mut ret = Ok(Outcome::Scalar(0)); for value in values { ret = ret.and_then(|outcome: Outcome| match outcome { Outcome::List(_) => Err(FailedTo::ProcessInput), Outcome::Scalar(acc) => acc .checked_add(value) .map(|new_acc: i32| Outcome::Scalar(new_acc)) .ok_or(FailedTo::SumValues), }) } ret } impl Outcome { pub fn sum(self) -> Result { match self { Outcome::Scalar(value) => Ok(Outcome::Scalar(value)), Outcome::List(values) => sum_of(values), } } } #[cfg(test)] mod unit_tests { use super::*; #[test] fn check_sum() { let outcome = Handful::grab(5, 1).roll().sum(); assert_eq!(outcome, Ok(Outcome::Scalar(5))); } }