diff options
author | Joris | 2021-01-03 13:40:40 +0100 |
---|---|---|
committer | Joris | 2021-01-03 13:54:20 +0100 |
commit | 11052951b74b9ad4b6a9412ae490086235f9154b (patch) | |
tree | 64526ac926c1bf470ea113f6cac8a33158684e8d /src/payer.rs | |
parent | 371449b0e312a03162b78797b83dee9d81706669 (diff) | |
download | budget-11052951b74b9ad4b6a9412ae490086235f9154b.tar.gz budget-11052951b74b9ad4b6a9412ae490086235f9154b.tar.bz2 budget-11052951b74b9ad4b6a9412ae490086235f9154b.zip |
Rewrite in Rust
Diffstat (limited to 'src/payer.rs')
-rw-r--r-- | src/payer.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/payer.rs b/src/payer.rs new file mode 100644 index 0000000..48cee52 --- /dev/null +++ b/src/payer.rs @@ -0,0 +1,38 @@ +use std::collections::HashMap; + +use crate::model::user::User; + +pub fn exceeding( + users: &Vec<User>, + user_incomes: &HashMap<i64, i64>, + user_payments: &HashMap<i64, i64>, +) -> Vec<(String, i64)> { + let ratios = users.into_iter().map(|u| { + let income = *user_incomes.get(&u.id).unwrap_or(&0); + if income == 0 { + (u.name.clone(), 0, 0.0) + } else { + let payments = *user_payments.get(&u.id).unwrap_or(&0); + let ratio = payments as f64 / income as f64; + (u.name.clone(), income, ratio) + } + }); + let min_ratio = ratios + .clone() + .map(|r| r.2) + .min_by(|r1, r2| { + ((r1 * 100_000_000.0).round() as i64) + .cmp(&((r2 * 100_000_000.0).round() as i64)) + }) + .unwrap_or(0.0); + ratios + .filter_map(|r| { + let exceeding = ((r.2 - min_ratio) * r.1 as f64).round() as i64; + if exceeding == 0 { + None + } else { + Some((r.0, exceeding)) + } + }) + .collect() +} |