in starlark/src/stdlib/funcs.rs [677:712]
fn max(mut args: Vec<Value>, key: Option<Value>) -> anyhow::Result<Value<'v>> {
let args = if args.len() == 1 {
args.swap_remove(0)
} else {
heap.alloc(args)
};
let mut it = args.iterate(heap)?;
let mut max = match it.next() {
Some(x) => x,
None => {
return Err(anyhow!(
"Argument is an empty iterable, max() expect a non empty iterable"
));
}
};
match key {
None => {
for i in it {
if max.compare(i)? == Ordering::Less {
max = i;
}
}
}
Some(key) => {
let mut cached = key.invoke_pos(&[max], eval)?;
for i in it {
let keyi = key.invoke_pos(&[i], eval)?;
if cached.compare(keyi)? == Ordering::Less {
max = i;
cached = keyi;
}
}
}
};
Ok(max)
}