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}