tfsi/components/
component_pair.rs

1use crate::component::Component;
2use crate::require::Require;
3
4#[derive(Debug)]
5pub struct IdxLeft<I>(std::marker::PhantomData<I>);
6#[derive(Debug)]
7pub struct IdxRight<I>(std::marker::PhantomData<I>);
8
9/// A `Component` that combines two `Component`s.
10///
11/// It forwards the `Component::component_provide` methods to the underlying `Component`s.
12#[derive(Debug, Clone)]
13pub struct ComponentPair<Left, Right> {
14    left: Left,
15    right: Right,
16}
17
18impl<Left, Right> ComponentPair<Left, Right> {
19    /// Consume this `ComponentPair` and yield its `left` and `right`.
20    pub fn into_inner(self) -> (Left, Right) {
21        (self.left, self.right)
22    }
23}
24
25impl<Left, Right> From<(Left, Right)> for ComponentPair<Left, Right> {
26    fn from(pair: (Left, Right)) -> Self {
27        let (left, right) = pair;
28        Self { left, right }
29    }
30}
31
32impl<'p, 'd, T, I, Left, Right> Component<'p, 'd, T, IdxLeft<I>> for ComponentPair<Left, Right>
33where
34    Left: Component<'p, 'd, T, I>,
35{
36    type Requirement = Left::Requirement;
37
38    fn component_provide(&'p self, deps: &<Self::Requirement as Require<'p, 'd>>::Provider) -> T {
39        self.left.component_provide(deps)
40    }
41}
42
43impl<'p, 'd, T, I, Left, Right> Component<'p, 'd, T, IdxRight<I>> for ComponentPair<Left, Right>
44where
45    Right: Component<'p, 'd, T, I>,
46{
47    type Requirement = Right::Requirement;
48
49    fn component_provide(&'p self, deps: &<Self::Requirement as Require<'p, 'd>>::Provider) -> T {
50        self.right.component_provide(deps)
51    }
52}