41 lines
1.0 KiB
Rust
41 lines
1.0 KiB
Rust
use crate::*;
|
|
|
|
fn min_of(values: Vec<i32>) -> Result<Outcome, FailedTo> {
|
|
if values.is_empty() {
|
|
return Err(FailedTo::ProcessInput);
|
|
}
|
|
Ok(Outcome::Scalar(i32::MIN)).and_then(|_| {
|
|
values
|
|
.iter()
|
|
.min()
|
|
.ok_or(FailedTo::FindMin)
|
|
.map(|min| Outcome::Scalar(*min))
|
|
})
|
|
}
|
|
|
|
impl Outcome {
|
|
pub fn min(self) -> Result<Outcome, FailedTo> {
|
|
match self {
|
|
Outcome::Scalar(value) => Ok(Outcome::Scalar(value)),
|
|
Outcome::List(values) => min_of(values),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod unit_tests {
|
|
use super::*;
|
|
#[test]
|
|
fn check_min() {
|
|
let roll_result = Handful::grab(2, 20).roll();
|
|
let min_result = roll_result.clone().min().unwrap();
|
|
match roll_result {
|
|
Outcome::List(values) => {
|
|
let min = values.iter().min().unwrap();
|
|
assert_eq!(min_result, Outcome::Scalar(*min));
|
|
}
|
|
_ => panic!("result is not a list"),
|
|
}
|
|
}
|
|
}
|