roopes_core/primitives/handler/
lambda.rs

1//! Provides a simple wrapper [`Lambda`] struct
2//! around [`Delegate`], `Fn(&I)` types.
3
4use super::Handler;
5use std::marker::PhantomData;
6
7/// A [`Lambda`] [`Delegate`] receives a borrowed
8/// message.
9pub trait Delegate<M> = Fn(&M);
10
11/// Defines an encapsulated [`Handler`] as a
12/// struct, which just delegates its execution to
13/// the attached [`Delegate`].
14///
15/// # Examples
16/// ``` rust
17/// use roopes::prelude::*;
18/// let handler = handler::Lambda::new(|msg| {
19///     println!("{msg}");
20/// });
21/// handler.handle(&"Hello world!".to_string());
22/// ```
23#[derive(Clone)]
24pub struct Lambda<C, M>
25where
26    C: Delegate<M>,
27{
28    delegate: C,
29    _t: PhantomData<M>,
30}
31
32impl<C, M> Lambda<C, M>
33where
34    C: Delegate<M>,
35{
36    /// Creates a [`Lambda`] from a given
37    /// [`Delegate`].
38    pub fn new(delegate: C) -> Lambda<C, M>
39    {
40        Lambda {
41            delegate,
42            _t: PhantomData,
43        }
44    }
45}
46
47impl<C, M> Handler<M> for Lambda<C, M>
48where
49    C: Delegate<M>,
50{
51    fn handle(
52        &self,
53        message: &M,
54    )
55    {
56        (self.delegate)(message);
57    }
58}
59
60impl<C, M> From<C> for Lambda<C, M>
61where
62    C: Delegate<M>,
63{
64    fn from(delegate: C) -> Self
65    {
66        Lambda::new(delegate)
67    }
68}