1use crate::box_iter::box_once;
4use crate::{Bind, Cv, DataT, Exn, Native, PathsPtr, RunPtr, ValR, ValXs};
5use alloc::boxed::Box;
6
7pub type Filter<F> = (&'static str, Box<[Bind]>, F);
9
10pub type Fun<D> = Filter<Native<D>>;
12
13pub fn run<D: DataT>((name, arity, run): Filter<RunPtr<D>>) -> Fun<D> {
15 (name, arity, Native::new(run))
16}
17
18pub(crate) type RunPathsPtr<D> = (RunPtr<D>, PathsPtr<D>);
19
20pub(crate) fn paths<D: DataT>((name, arity, (run, paths)): Filter<RunPathsPtr<D>>) -> Fun<D> {
22 (name, arity, Native::new(run).with_paths(paths))
23}
24
25pub fn v(n: usize) -> Box<[Bind]> {
27 core::iter::repeat(Bind::Var(())).take(n).collect()
28}
29
30pub fn bome<'a, V: 'a>(r: ValR<V>) -> ValXs<'a, V> {
32 box_once(r.map_err(Exn::from))
33}
34
35pub fn unary<'a, D: DataT>(
38 mut cv: Cv<'a, D>,
39 f: impl Fn(D::V<'a>, D::V<'a>) -> ValR<D::V<'a>> + 'a,
40) -> ValXs<'a, D::V<'a>> {
41 bome(f(cv.1, cv.0.pop_var()))
42}