use core::fmt::{Display, Error, Formatter};
#[derive(Clone)]
pub struct Function<I, O, C> {
function_ptr: fn(&mut I) -> O,
context: C,
}
impl<I, O, C> Function<I, O, C> {
pub fn new(function_ptr: fn(&mut I) -> O, context: C) -> Self {
Self {
function_ptr,
context,
}
}
pub fn get_context(&self) -> &C {
&self.context
}
pub fn call(&self, input: &mut I) -> O {
(self.function_ptr)(input)
}
}
impl<I, O, C> Display for Function<I, O, C> {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "<fn at {:?}>", self.function_ptr as *const u8)
}
}
impl<I: Clone, O: Clone, C: Copy> Copy for Function<I, O, C> {}
impl<I, O, C: PartialEq> PartialEq for Function<I, O, C> {
fn eq(&self, rhs: &Self) -> bool {
self.context == rhs.context
}
}
impl<I, O, C> Default for Function<I, O, C>
where
I: Default,
O: Default,
C: Default,
{
fn default() -> Self {
Self::new(|_: &mut I| Default::default(), Default::default())
}
}