use rf_core::lang::builtins::{foldhood_plus, mux};
use rf_core::lang::{nbr, rep};
use rf_core::sensor_id::sensor;
use rf_core::vm::round_vm::RoundVM;
use rf_core::{foldhood_plus, lift};
pub fn gradient(vm: RoundVM) -> (RoundVM, f64) {
fn is_source(vm: RoundVM) -> (RoundVM, bool) {
let val = *vm.local_sense::<bool>(&sensor("source")).unwrap();
(vm, val)
}
rep(vm, lift!(f64::INFINITY), |vm1, d| {
mux(
vm1,
is_source,
lift!(0.0),
foldhood_plus!(lift!(f64::INFINITY), |a, b| a.min(b), |vm2| {
let (vm_, val) = nbr(vm2, lift!(d));
(vm_, val + 1.0)
}),
)
})
}