summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2026-03-31 15:12:08 +0200
committerIgor Pashev <pashev.igor@gmail.com>2026-03-31 15:12:08 +0200
commit2b63c2dc3c1cf5a78e55bc567066d398c940aeb5 (patch)
tree5882a870ac558cff5354f579aa76f3131fdc2aae /src
parent9cb69e7fe09caa71cdea5b3f1911076c24ad6ba0 (diff)
downloadbalance-2b63c2dc3c1cf5a78e55bc567066d398c940aeb5.tar.gz
Generalize a bit
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/lib.rs b/src/lib.rs
index eead58f..5f0903a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,10 +1,23 @@
-pub fn brutal(arr: &[usize]) -> Option<usize> {
- let sum: usize = arr.iter().sum();
+use std::{
+ cmp::PartialEq,
+ iter::Sum,
+ ops::{Add, Sub},
+};
+
+pub fn brutal<T>(arr: &[T]) -> Option<usize>
+where
+ T: for<'a> Sum<&'a T>
+ + for<'a> Sub<&'a T, Output = T>
+ + for<'a> Add<&'a T, Output = T>
+ + PartialEq
+ + Copy,
+{
+ let sum: T = arr.iter().sum();
let x = arr
.iter()
.enumerate()
- .try_fold((0, sum), |(left, right), (idx, x)| {
+ .try_fold((sum - &sum, sum), |(left, right), (idx, x)| {
if left == right - x {
Err(idx)
} else {
@@ -12,7 +25,7 @@ pub fn brutal(arr: &[usize]) -> Option<usize> {
}
});
- if let Err(idx) = x { Some(idx) } else { None }
+ x.err()
}
#[cfg(test)]