roopes_core/patterns/abstract_factory/
lambda.rs

1//! Provides a simple wrapper struct around
2//! [`Emitter`], `Fn()->T` types.
3use super::AbstractFactory;
4use crate::prelude::*;
5use std::marker::PhantomData;
6
7/// Created new objects by repeatedly calling its
8/// delegated [`Emitter`].
9pub struct Lambda<D, R>
10where
11    D: Emitter<R>,
12{
13    delegate: D,
14    _retain_types: PhantomData<(D, R)>,
15}
16
17impl<D, R> AbstractFactory<R> for Lambda<D, R>
18where
19    D: Emitter<R>,
20{
21    /// Creates the given type from the
22    /// [`delegate`].
23    fn create(&self) -> R
24    {
25        self.delegate.emit()
26    }
27}
28
29impl<D, R> Lambda<D, R>
30where
31    D: Emitter<R>,
32{
33    /// Creates a new [`Lambda`] from the supplied
34    /// [`Emitter`].
35    pub fn new(delegate: D) -> Lambda<D, R>
36    {
37        Lambda {
38            delegate,
39            _retain_types: PhantomData,
40        }
41    }
42}
43
44impl<D, R> From<D> for Lambda<D, R>
45where
46    D: Emitter<R>,
47{
48    fn from(delegate: D) -> Self
49    {
50        Lambda::new(delegate)
51    }
52}