bulks/
impl_iter.rs

1use core::ops::Try;
2
3use array_trait::{same::Same, length};
4
5use crate::{Bulk, DoubleEndedBulk, IntoBulk};
6
7pub mod iter
8{
9    pub struct Bulk<T>
10    where
11        T: IntoIterator<IntoIter: ExactSizeIterator>
12    {
13        pub(super) inner: T::IntoIter
14    }
15}
16
17impl<T, A, I> iter::Bulk<T>
18where
19    T: IntoIterator<Item = A, IntoIter = I>,
20    I: ExactSizeIterator<Item = A>
21{
22    pub const fn by_ref(&mut self) -> &mut T::IntoIter
23    {
24        let Self { inner } = self;
25        inner
26    }
27}
28
29impl<T, A, I> IntoIterator for iter::Bulk<T>
30where
31    T: IntoIterator<Item = A, IntoIter = I>,
32    I: ExactSizeIterator<Item = A>
33{
34    type IntoIter = I;
35    type Item = A;
36    
37    fn into_iter(self) -> Self::IntoIter
38    {
39        self.inner
40    }
41}
42
43impl<T, A, I> IntoBulk for T
44where
45    T: IntoIterator<Item = A, IntoIter = I>,
46    I: ExactSizeIterator<Item = A>
47{
48    default type IntoBulk = iter::Bulk<T>;
49
50    default fn into_bulk(self) -> Self::IntoBulk
51    {
52        iter::Bulk::<T> {
53            inner: self.into_iter()
54        }.same().ok().unwrap()
55    }
56}
57
58impl<T, A, I> Bulk for iter::Bulk<T>
59where
60    T: IntoIterator<Item = A, IntoIter = I>,
61    I: ExactSizeIterator<Item = A>
62{
63    #[inline]
64    fn len(&self) -> usize
65    {
66        self.inner.len()
67    }
68    #[inline]
69    fn is_empty(&self) -> bool
70    {
71        self.inner.is_empty()
72    }
73
74    #[inline]
75    fn for_each<F>(self, f: F)
76    where
77        Self: Sized,
78        F: FnMut(Self::Item)
79    {
80        self.inner.for_each(f)
81    }
82    #[inline]
83    fn try_for_each<F, R>(mut self, f: F) -> R
84    where
85        Self: Sized,
86        F: FnMut(Self::Item) -> R,
87        R: core::ops::Try<Output = ()>
88    {
89        self.inner.try_for_each(f)
90    }
91
92    fn first(mut self) -> Option<Self::Item>
93    where
94        Self: Sized
95    {
96        self.inner.next()
97    }
98    
99    fn nth<L>(mut self, n: L) -> Option<Self::Item>
100    where
101        Self: Sized,
102        L: length::LengthValue
103    {
104        self.inner.nth(length::value::len(n))
105    }
106}
107impl<T, A, I> DoubleEndedBulk for iter::Bulk<T>
108where
109    T: IntoIterator<Item = A, IntoIter = I>,
110    I: ExactSizeIterator<Item = A> + DoubleEndedIterator
111{
112    fn rev_for_each<F>(self, f: F)
113    where
114        Self: Sized,
115        F: FnMut(Self::Item)
116    {
117        self.inner.rev().for_each(f);
118    }
119    fn try_rev_for_each<F, R>(self, f: F) -> R
120    where
121        Self: Sized,
122        F: FnMut(Self::Item) -> R,
123        R: Try<Output = ()>
124    {
125        self.inner.rev().try_for_each(f)
126    }
127}
128
129#[cfg(test)]
130mod test
131{
132    use crate::{Bulk, IntoBulk};
133
134    #[test]
135    fn vec()
136    {
137        let a = vec![1i32, 2, 3, 4, 5];
138        let bulk = a.into_bulk().map(|x| x as f64);
139        let b = bulk.collect::<Vec<f64>>();
140        println!("{b:?}")
141    }
142}