use core::{borrow::Borrow, marker::PhantomData}; use crate::Node; pub struct FnNode O, In, O>(T, PhantomData, PhantomData); impl<'n, T: Fn(&In) -> O, In, O: 'n> Node<'n, In> for FnNode { type Output = O; fn eval(&'n self, input: &'n In) -> Self::Output { self.0(input.borrow()) } } impl O, In, O> FnNode { pub fn new(f: T) -> Self { FnNode(f, PhantomData::default(), PhantomData::default()) } } pub struct FnNodeWithState O, In, O, State>( T, State, PhantomData, PhantomData, ); impl<'n, T: Fn(&In, &State) -> O, In, O: 'n, State> Node<'n, In> for FnNodeWithState { type Output = O; fn eval(&'n self, input: &'n In) -> Self::Output { self.0(input.borrow(), &self.1) } } impl O, In, O, State> FnNodeWithState { pub fn new(f: T, state: State) -> Self { FnNodeWithState(f, state, PhantomData::default(), PhantomData::default()) } }