diff options
Diffstat (limited to 'src/calculator.rs')
| -rw-r--r-- | src/calculator.rs | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/calculator.rs b/src/calculator.rs index 9611a2b..7289921 100644 --- a/src/calculator.rs +++ b/src/calculator.rs @@ -61,7 +61,7 @@ impl DiceCalculator { rolls.push(final_rolls); } - // handle high/low and discard high/low + // handle high/low, discard high/low and unique deduplication let mut final_rolls = rolls; for modifier in &dice.modifiers { match modifier { @@ -89,6 +89,17 @@ impl DiceCalculator { sorted.sort(); final_rolls = sorted.iter().skip(*n as usize).map(|&v| vec![v]).collect(); } + DiceModifier::Unique => { + use std::collections::HashSet; + let mut seen = HashSet::new(); + let mut uniques: Vec<i32> = Vec::new(); + for v in final_rolls.iter().flatten() { + if seen.insert(*v) { + uniques.push(*v); + } + } + final_rolls = uniques.into_iter().map(|v| vec![v]).collect(); + } _ => {} } } @@ -204,6 +215,7 @@ impl DiceCalculator { DiceModifier::KeepLow(n) => result.push_str(&format!("kl{}", n)), DiceModifier::DropHigh(n) => result.push_str(&format!("dh{}", n)), DiceModifier::DropLow(n) => result.push_str(&format!("dl{}", n)), + DiceModifier::Unique => result.push('u'), } } result |
