orx_iterable/transformations/
reversed.rs

1use crate::{Collection, CollectionMut, Iterable};
2use core::marker::PhantomData;
3use orx_self_or::SoM;
4
5/// Wraps an `Iterable` and creates a new `Iterable` which yields the elements
6/// of the original iterable in reverse order.
7pub struct Reversed<I>
8where
9    I: Iterable,
10    I::Iter: DoubleEndedIterator,
11{
12    pub(crate) it: I,
13}
14
15impl<I> Iterable for Reversed<I>
16where
17    I: Iterable,
18    I::Iter: DoubleEndedIterator,
19{
20    type Item = I::Item;
21
22    type Iter = core::iter::Rev<I::Iter>;
23
24    fn iter(&self) -> Self::Iter {
25        self.it.iter().rev()
26    }
27}
28
29// col
30
31/// Wraps an `Collection` and creates a new `Collection` which yields the elements
32/// of the original iterable in reverse order.
33pub struct ReversedCol<I, E>
34where
35    I: Collection,
36    E: SoM<I>,
37    for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
38{
39    pub(crate) it: E,
40    pub(crate) phantom: PhantomData<I>,
41}
42
43impl<'a, I, E> Iterable for &'a ReversedCol<I, E>
44where
45    I: Collection,
46    E: SoM<I>,
47    for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
48{
49    type Item = &'a I::Item;
50
51    type Iter = core::iter::Rev<<I::Iterable<'a> as Iterable>::Iter>;
52
53    fn iter(&self) -> Self::Iter {
54        self.it.get_ref().iter().rev()
55    }
56}
57
58impl<I, E> Collection for ReversedCol<I, E>
59where
60    I: Collection,
61    E: SoM<I>,
62    for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
63{
64    type Item = I::Item;
65
66    type Iterable<'i>
67        = &'i Self
68    where
69        Self: 'i;
70
71    fn as_iterable(&self) -> Self::Iterable<'_> {
72        self
73    }
74}
75
76impl<I, E> CollectionMut for ReversedCol<I, E>
77where
78    I: CollectionMut,
79    E: SoM<I>,
80    for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
81    for<'b> I::IterMut<'b>: DoubleEndedIterator,
82{
83    type IterMut<'i>
84        = core::iter::Rev<I::IterMut<'i>>
85    where
86        Self: 'i;
87
88    fn iter_mut(&mut self) -> Self::IterMut<'_> {
89        self.it.get_mut().iter_mut().rev()
90    }
91}