use sim_kernel::{
Cx, Ref, Result, Symbol,
control::{ControlPrompt as KernelControlPrompt, default_control_result_shape, prompt},
};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ControlTag {
symbol: Symbol,
}
impl ControlTag {
pub fn new(symbol: Symbol) -> Self {
Self { symbol }
}
pub fn symbol(&self) -> &Symbol {
&self.symbol
}
pub fn into_symbol(self) -> Symbol {
self.symbol
}
}
pub trait ControlPrompt {
fn tag(&self) -> ControlTag;
fn input(&self) -> Ref {
Ref::Symbol(self.tag().into_symbol())
}
fn result_shape(&self) -> Ref {
default_control_result_shape()
}
}
pub fn raise_prompt(cx: &mut Cx, prompt_record: &dyn ControlPrompt) -> Result<Ref> {
let kernel_prompt = KernelControlPrompt::new(
Ref::Symbol(prompt_record.tag().into_symbol()),
prompt_record.input(),
prompt_record.result_shape(),
);
let input = kernel_prompt.input.clone();
prompt(cx, kernel_prompt, |_cx| Ok(input))
}