orx_iterable/obj_safe/transformations/
taken_while.rs

1use 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
21// col
22
23impl<'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}