orx_iterable/transformations/
reversed.rs1use crate::{Collection, CollectionMut, Iterable};
2use core::marker::PhantomData;
3use orx_self_or::SoM;
4
5pub 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
29pub 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}