use sim_kernel::{
Cx, Ref, Result,
control::{ControlAbort, ControlPrompt, abort, default_control_result_shape, prompt},
};
use crate::clojure_recur_prompt_symbol;
pub fn clojure_loop_prompt_ref() -> Ref {
Ref::Symbol(clojure_recur_prompt_symbol())
}
pub fn clojure_loop_prompt<F>(cx: &mut Cx, input: Ref, body: F) -> Result<Ref>
where
F: FnOnce(&mut Cx) -> Result<Ref>,
{
prompt(
cx,
ControlPrompt::new(
clojure_loop_prompt_ref(),
input,
default_control_result_shape(),
),
body,
)
}
pub fn clojure_recur(cx: &mut Cx, value: Ref) -> Result<Ref> {
abort(
cx,
ControlAbort::new(
clojure_loop_prompt_ref(),
value,
default_control_result_shape(),
),
)
}