diff --git a/01.workspace/oxidice_lib/examples/roll_4d6_keep_3.rs b/01.workspace/oxidice_lib/examples/roll_4d6_keep_3.rs new file mode 100644 index 0000000..b108c0e --- /dev/null +++ b/01.workspace/oxidice_lib/examples/roll_4d6_keep_3.rs @@ -0,0 +1,11 @@ +use oxidice_lib::dice::*; + +fn main() { + let roll = Handful::grab(4, 6).roll(); + print!("{roll} -> "); + let roll = roll.keep_highest(3).unwrap(); + print!("{roll} -> "); + let roll = roll.sum().unwrap(); + print!("{roll}"); + println!(); +} diff --git a/01.workspace/oxidice_lib/examples/roll_exploding_d6.rs b/01.workspace/oxidice_lib/examples/roll_exploding_d6.rs index 8685df2..f053221 100644 --- a/01.workspace/oxidice_lib/examples/roll_exploding_d6.rs +++ b/01.workspace/oxidice_lib/examples/roll_exploding_d6.rs @@ -1,6 +1,6 @@ use oxidice_lib::dice::*; -fn main(){ +fn main() { let roll = Handful::grab_exploding(1, 6, 6).roll(); println!("{roll}"); } diff --git a/01.workspace/oxidice_lib/src/imp/mod.rs b/01.workspace/oxidice_lib/src/imp/mod.rs index 8759239..b0c6621 100644 --- a/01.workspace/oxidice_lib/src/imp/mod.rs +++ b/01.workspace/oxidice_lib/src/imp/mod.rs @@ -1,6 +1,7 @@ pub mod die_roll; pub mod handful_grab; pub mod handful_roll; +pub mod outcome_keep_highest; pub mod outcome_max; pub mod outcome_min; pub mod outcome_sum; diff --git a/01.workspace/oxidice_lib/src/imp/outcome_keep_highest.rs b/01.workspace/oxidice_lib/src/imp/outcome_keep_highest.rs new file mode 100644 index 0000000..fba6eb8 --- /dev/null +++ b/01.workspace/oxidice_lib/src/imp/outcome_keep_highest.rs @@ -0,0 +1,22 @@ +use crate::*; +use std::cmp::*; + +impl Outcome { + pub fn keep_highest(self, dice_num: u16) -> Result { + if dice_num == 0 { + return Err(FailedTo::ProcessInput); + } + match self { + Outcome::Scalar(value) => Ok(Outcome::List(vec![value])), + Outcome::List(mut values) => { + values.sort_by_key(|&num| Reverse(num)); + Ok(Outcome::List( + values.into_iter().take(dice_num as usize).collect(), + )) + } + } + } +} + +// #[cfg(test)] +// mod unit_tests { use super::*; }