in starlark/src/stdlib/funcs.rs [731:766]
fn min(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 min = match it.next() {
Some(x) => x,
None => {
return Err(anyhow!(
"Argument is an empty iterable, min() expect a non empty iterable"
));
}
};
match key {
None => {
for i in it {
if min.compare(i)? == Ordering::Greater {
min = i;
}
}
}
Some(key) => {
let mut cached = key.invoke_pos(&[min], eval)?;
for i in it {
let keyi = key.invoke_pos(&[i], eval)?;
if cached.compare(keyi)? == Ordering::Greater {
min = i;
cached = keyi;
}
}
}
};
Ok(min)
}