use std::sync::Arc;
use crate::ast::Value;
use crate::kernel::{Kernel, KernelProgram, PolydatKernel, WriteError};
pub fn bind_under(
parent: &dyn Kernel,
program: Arc<dyn KernelProgram>,
iter_bindings: &[(String, Value)],
) -> Result<Box<dyn Kernel>, crate::KernelError> {
let mut child = program.create_uninitialized();
for (var, value) in iter_bindings {
child
.set_input(var, value.clone())
.map_err(crate::KernelError::Write)?;
}
PolydatKernel::wire_child_under(child.as_mut(), parent)?;
Ok(child)
}
pub fn propagate_inputs(parent: &dyn Kernel, child: &mut dyn Kernel) -> Result<(), WriteError> {
let child_coords = child.coord_count();
for (index, name) in parent.input_names().iter().enumerate() {
let Some(value) = parent.input_value_at(index) else {
continue;
};
if matches!(value, Value::None) {
continue;
}
let Some(child_index) = child.input_index(name) else {
continue;
};
if child_index < child_coords || child.input_is_cell_bound(child_index) {
continue;
}
child.set_input_at(child_index, value)?;
}
Ok(())
}