roopes_core/primitives/handler/
heap.rs

1//! Provides a heap-based [`Handler`] which
2//! redirects [`Handler::handle`] calls
3//! to a delegate [`Handler`].  Useful when
4//! redirecting calls to unknown or mixed lists of
5//! [`Handler`]s.
6
7use super::Lambda;
8use crate::prelude::*;
9use delegate::delegate;
10
11/// Stores an indirected [`Handler`] in a [`Box`]
12/// for later delegation.
13pub struct Heap<M>
14{
15    delegate: Box<dyn Handler<M>>,
16}
17
18impl<M> Heap<M>
19{
20    /// Creates a new [`Heap`] with a given
21    /// [`Box`]ed [`Handler`]. # Examples
22    /// ``` rust
23    /// use roopes::prelude::*;
24    /// let my_handler =
25    ///     handler::Heap::new(Box::new(handler::Lambda::new(|message| {
26    ///         println!("{message}");
27    ///     })));
28    /// my_handler.handle(&"Hello World.".to_string());
29    /// ```
30    #[must_use]
31    pub fn new(delegate: Box<dyn Handler<M>>) -> Heap<M>
32    {
33        Heap { delegate }
34    }
35}
36
37impl<M> From<Box<dyn Handler<M>>> for Heap<M>
38{
39    fn from(value: Box<dyn Handler<M>>) -> Self
40    {
41        Heap::new(value)
42    }
43}
44
45#[allow(clippy::inline_always)]
46impl<M> Handler<M> for Heap<M>
47{
48    delegate! {
49        to self.delegate {
50           fn handle(&self, message: &M);
51        }
52    }
53}