orx_iterable/obj_safe/transformations/
taken_while.rs1use crate::{
2 obj_safe::{CollectionMutObj, CollectionObj, IterableObj},
3 transformations::{TakenWhile, TakenWhileCol, TakenWhileColIter, TakenWhileColIterMut},
4 Collection, CollectionMut, Iterable,
5};
6use orx_self_or::SoM;
7use std::boxed::Box;
8
9impl<I, P> IterableObj for TakenWhile<I, P>
10where
11 I: Iterable,
12 P: Fn(&I::Item) -> bool + Copy,
13{
14 type Item = I::Item;
15
16 fn boxed_iter(&self) -> Box<dyn Iterator<Item = Self::Item> + '_> {
17 Box::new(self.it.iter().take_while(self.take_while))
18 }
19}
20
21impl<'a, I, E, P> IterableObj for &'a TakenWhileCol<I, E, P>
24where
25 I: Collection,
26 E: SoM<I>,
27 P: Fn(&I::Item) -> bool + Copy,
28{
29 type Item = &'a I::Item;
30
31 fn boxed_iter(&self) -> Box<dyn Iterator<Item = Self::Item> + '_> {
32 let iter = self.it.get_ref().iter();
33 Box::new(TakenWhileColIter::<I, P> {
34 iter,
35 filter: self.take_while,
36 })
37 }
38}
39
40impl<I, E, P> CollectionObj for TakenWhileCol<I, E, P>
41where
42 I: Collection,
43 E: SoM<I>,
44 P: Fn(&I::Item) -> bool + Copy,
45{
46 type Item = I::Item;
47
48 fn boxed_iter(&self) -> Box<dyn Iterator<Item = &Self::Item> + '_> {
49 Box::new(self.iter())
50 }
51}
52
53impl<I, E, P> CollectionMutObj for TakenWhileCol<I, E, P>
54where
55 I: CollectionMut,
56 E: SoM<I>,
57 P: Fn(&I::Item) -> bool + Copy,
58{
59 fn boxed_iter_mut(&mut self) -> Box<dyn Iterator<Item = &mut Self::Item> + '_> {
60 let iter = self.it.get_mut().iter_mut();
61 Box::new(TakenWhileColIterMut::<I, P> {
62 iter,
63 filter: self.take_while,
64 })
65 }
66}