orx_iterable/obj_safe/transformations/
reversed.rs1use orx_self_or::SoM;
2
3use crate::{
4 obj_safe::{CollectionMutObj, CollectionObj, IterableObj},
5 transformations::{Reversed, ReversedCol},
6 Collection, CollectionMut, Iterable,
7};
8use std::boxed::Box;
9
10impl<I> IterableObj for Reversed<I>
11where
12 I: Iterable,
13 I::Iter: DoubleEndedIterator,
14{
15 type Item = I::Item;
16
17 fn boxed_iter(&self) -> Box<dyn Iterator<Item = Self::Item> + '_> {
18 Box::new(self.it.iter().rev())
19 }
20}
21
22impl<'a, I, E> IterableObj for &'a ReversedCol<I, E>
25where
26 I: Collection,
27 E: SoM<I>,
28 for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
29{
30 type Item = &'a I::Item;
31
32 fn boxed_iter(&self) -> Box<dyn Iterator<Item = Self::Item> + '_> {
33 Box::new(self.it.get_ref().iter().rev())
34 }
35}
36
37impl<I, E> CollectionObj for ReversedCol<I, E>
38where
39 I: Collection,
40 E: SoM<I>,
41 for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
42{
43 type Item = I::Item;
44
45 fn boxed_iter(&self) -> Box<dyn Iterator<Item = &Self::Item> + '_> {
46 Box::new(self.iter())
47 }
48}
49
50impl<I, E> CollectionMutObj for ReversedCol<I, E>
51where
52 I: CollectionMut,
53 E: SoM<I>,
54 for<'b> <I::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
55 for<'b> I::IterMut<'b>: DoubleEndedIterator,
56{
57 fn boxed_iter_mut(&mut self) -> Box<dyn Iterator<Item = &mut Self::Item> + '_> {
58 Box::new(self.it.get_mut().iter_mut().rev())
59 }
60}