roopes_core/primitives/transformer/
lambda.rs

1//! Provides a simple wrapper struct around
2//! [`Delegate`], `Fn(&I)->O` types.
3
4/// [`Lambda`] [`Delegate`]s given input and
5/// produce owned output.
6pub trait Delegate<I, O> = Fn(&I) -> O;
7
8use super::Transformer;
9use std::marker::PhantomData;
10
11/// Provides a type which redirects
12/// transformations to its enclosed [`Delegate`].
13#[derive(Clone)]
14pub struct Lambda<C, I, O>
15where
16    C: Delegate<I, O>,
17{
18    delegate: C,
19    _t: PhantomData<(I, O)>,
20}
21
22impl<C, I, O> Lambda<C, I, O>
23where
24    C: Delegate<I, O>,
25{
26    /// Creates a [`Lambda`] from a given
27    /// [`Delegate`].
28    pub fn new(delegate: C) -> Lambda<C, I, O>
29    {
30        Lambda {
31            delegate,
32            _t: PhantomData,
33        }
34    }
35}
36
37impl<C, I, O> Transformer<I, O> for Lambda<C, I, O>
38where
39    C: Delegate<I, O>,
40{
41    fn transform(
42        &self,
43        input: &I,
44    ) -> O
45    {
46        (self.delegate)(input)
47    }
48}
49
50impl<C, I, O> From<C> for Lambda<C, I, O>
51where
52    C: Delegate<I, O>,
53{
54    fn from(delegate: C) -> Self
55    {
56        Lambda::new(delegate)
57    }
58}