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}