Skip to content

Commit fe2e2c9

Browse files
committed
added max-by-key
1 parent 3c1b14c commit fe2e2c9

1 file changed

Lines changed: 22 additions & 0 deletions

File tree

ndc_lib/src/stdlib/sequence.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,28 @@ mod inner {
111111
Sequence::Deque(d) => d.try_borrow()?.iter().try_max(),
112112
}
113113
}
114+
pub fn max_by_key(seq: &mut Sequence, func: &Callable<'_>) -> EvaluationResult {
115+
let mut best_value = None;
116+
let mut best_key = None;
117+
118+
for value in mut_seq_to_iterator(seq) {
119+
if let Some(best_key_val) = &best_key {
120+
let new_key = func.call(&mut [value.clone()])?;
121+
if &new_key > best_key_val {
122+
best_key = Some(new_key);
123+
best_value = Some(value);
124+
}
125+
} else {
126+
best_key = Some(func.call(&mut [value.clone()])?);
127+
best_value = Some(value);
128+
}
129+
}
130+
131+
match best_value {
132+
None => Err(anyhow::anyhow!("empty input to max_by_key"))?,
133+
Some(value) => Ok(value),
134+
}
135+
}
114136

115137
/// Returns the lowest element in the sequence.
116138
pub fn min(seq: &Sequence) -> anyhow::Result<Value> {

0 commit comments

Comments
 (0)