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}