1 //! Licensed under the Apache License, Version 2.0
2 //! http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
3 //! http://opensource.org/licenses/MIT, at your
4 //! option. This file may not be copied, modified, or distributed
5 //! except according to those terms.
8 #[macro_use] extern crate itertools as it;
14 use it
::free
::put_back
;
20 let mut prod
= iproduct
!(s
.chars(), 0..2);
21 assert
!(prod
.next() == Some(('α'
, 0)));
22 assert
!(prod
.next() == Some(('α'
, 1)));
23 assert
!(prod
.next() == Some(('β'
, 0)));
24 assert
!(prod
.next() == Some(('β'
, 1)));
25 assert
!(prod
.next() == None
);
29 fn product_temporary() {
30 for (_x
, _y
, _z
) in iproduct
!(
31 [0, 1, 2].iter().cloned(),
32 [0, 1, 2].iter().cloned(),
33 [0, 1, 2].iter().cloned())
42 let mut zip
= izip
!(2..3);
43 assert
!(zip
.next() == Some(2));
44 assert
!(zip
.next().is_none());
46 let mut zip
= izip
!(0..3, 0..2, 0..2i8);
48 assert
!((i
as usize, i
, i
as i8) == zip
.next().unwrap());
50 assert
!(zip
.next().is_none());
52 let xs
: [isize; 0] = [];
53 let mut zip
= izip
!(0..3, 0..2, 0..2i8, &xs
);
54 assert
!(zip
.next().is_none());
59 let mut zip
= multizip((0..3, 0..2, 0..2i8));
61 assert
!((i
as usize, i
, i
as i8) == zip
.next().unwrap());
63 assert
!(zip
.next().is_none());
65 let xs
: [isize; 0] = [];
66 let mut zip
= multizip((0..3, 0..2, 0..2i8, xs
.iter()));
67 assert
!(zip
.next().is_none());
69 for (_
, _
, _
, _
, _
) in multizip((0..3, 0..2, xs
.iter(), &xs
, xs
.to_vec())) {
78 let cnt
= ys
.iter_mut().set_from(xs
.iter().map(|x
| *x
));
79 assert
!(cnt
== xs
.len());
80 assert
!(ys
== [7, 9, 8, 0, 0]);
82 let cnt
= ys
.iter_mut().set_from(0..10);
83 assert
!(cnt
== ys
.len());
84 assert
!(ys
== [0, 1, 2, 3, 4]);
88 fn test_interleave() {
90 let ys
= [7u8, 9, 8, 10];
92 let it
= interleave(xs
.iter(), ys
.iter());
93 it
::assert_equal(it
, ys
.iter());
95 let rs
= [7u8, 2, 9, 77, 8, 10];
96 let it
= interleave(ys
.iter(), zs
.iter());
97 it
::assert_equal(it
, rs
.iter());
102 let xs
= [1i32, 2, 3];
104 xs
.iter().foreach(|elt
| sum
+= *elt
);
111 let mut it
= xs
.iter().dropping(2);
112 assert_eq
!(it
.next(), Some(&3));
113 assert
!(it
.next().is_none());
114 let mut it
= xs
.iter().dropping(5);
115 assert
!(it
.next().is_none());
120 let xs
= [0, 1, 2, 1, 3];
121 let ys
= [(0, 1), (2, 1)];
123 // An iterator that gathers elements up in pairs
124 let pit
= xs
.iter().cloned().batching(|it
| {
127 Some(x
) => match it
.next() {
129 Some(y
) => Some((x
, y
)),
133 it
::assert_equal(pit
, ys
.iter().cloned());
138 let xs
= [0, 1, 1, 1, 2, 1, 3, 3];
139 let mut pb
= put_back(xs
.iter().cloned());
143 it
::assert_equal(pb
, xs
.iter().cloned());
148 it
::assert_equal((0..10).step(1), 0..10);
149 it
::assert_equal((0..10).step(2), (0..10).filter(|x
: &i32| *x
% 2 == 0));
150 it
::assert_equal((0..10).step(10), 0..1);
155 it
::assert_equal((0..10).step(2).merge((1..10).step(2)), 0..10);
162 let mut it
= it
::repeat_n(s
, 3);
163 assert_eq
!(it
.len(), 3);
164 assert_eq
!(it
.next(), Some(s
));
165 assert_eq
!(it
.next(), Some(s
));
166 assert_eq
!(it
.next(), Some(s
));
167 assert_eq
!(it
.next(), None
);
168 assert_eq
!(it
.next(), None
);
173 // Check that RepeatN only clones N - 1 times.
175 use core
::cell
::Cell
;
176 #[derive(PartialEq, Debug)]
183 fn clone(&self) -> Self
185 let n
= self.n
.get();
187 Foo { n: Cell::new(n + 1) }
193 let f
= Foo{n: Cell::new(0)}
;
194 let it
= it
::repeat_n(f
, n
);
196 let last
= it
.last();
198 assert_eq
!(last
, None
);
200 assert_eq
!(last
, Some(Foo{n: Cell::new(n - 1)}
));
207 let mut data
= [7, 1, 1, 9, 1, 1, 3];
208 let i
= it
::partition(&mut data
, |elt
| *elt
>= 3);
210 assert_eq
!(data
, [7, 3, 9, 1, 1, 1, 1]);
212 let i
= it
::partition(&mut data
, |elt
| *elt
== 1);
214 assert_eq
!(data
, [1, 1, 1, 1, 9, 3, 7]);
216 let mut data
= [1, 2, 3, 4, 5, 6, 7, 8, 9];
217 let i
= it
::partition(&mut data
, |elt
| *elt
% 3 == 0);
219 assert_eq
!(data
, [9, 6, 3, 4, 5, 2, 7, 8, 1]);
228 let flattened1
= flatten(data
.into_iter().cloned());
229 let flattened2
= flattened1
.clone();
231 it
::assert_equal(flattened1
, &[1,2,3,4,5,6]);
232 it
::assert_equal(flattened2
, &[1,2,3,4,5,6]);
238 assert_eq
!((0..i
).tree_fold1(|x
, y
| x
+ y
), (0..i
).fold1(|x
, y
| x
+ y
));