6 let xs = [0, 1, 2, 4, 5];
9 let mut it = xs.iter().zip(&ys);
10 assert_eq!(it.nth(0), Some((&0, &10)));
11 assert_eq!(it.nth(1), Some((&2, &12)));
12 assert_eq!(it.nth(0), None);
14 let mut it = xs.iter().zip(&ys);
15 assert_eq!(it.nth(3), None);
17 let mut it = ys.iter().zip(&xs);
18 assert_eq!(it.nth(3), None);
21 fn test_zip_nth_side_effects() {
22 let mut a = Vec::new();
23 let mut b = Vec::new();
24 let value = [1, 2, 3, 4, 5, 6]
31 .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
37 assert_eq!(value, Some((50, 6000)));
38 assert_eq!(a, vec![1, 2, 3, 4, 5]);
39 assert_eq!(b, vec![200, 300, 400, 500, 600]);
42 fn test_zip_next_back_side_effects() {
43 let mut a = Vec::new();
44 let mut b = Vec::new();
45 let mut iter = [1, 2, 3, 4, 5, 6]
52 .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
57 // The second iterator is one item longer, so `next_back` is called on it
59 assert_eq!(iter.next_back(), Some((60, 7000)));
60 assert_eq!(iter.next_back(), Some((50, 6000)));
61 assert_eq!(iter.next_back(), Some((40, 5000)));
62 assert_eq!(iter.next_back(), Some((30, 4000)));
63 assert_eq!(a, vec![6, 5, 4, 3]);
64 assert_eq!(b, vec![800, 700, 600, 500, 400]);
67 fn test_zip_nth_back_side_effects() {
68 let mut a = Vec::new();
69 let mut b = Vec::new();
70 let value = [1, 2, 3, 4, 5, 6]
77 .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
82 assert_eq!(value, Some((30, 4000)));
83 assert_eq!(a, vec![6, 5, 4, 3]);
84 assert_eq!(b, vec![800, 700, 600, 500, 400]);
87 fn test_zip_next_back_side_effects_exhausted() {
88 let mut a = Vec::new();
89 let mut b = Vec::new();
90 let mut iter = [1, 2, 3, 4, 5, 6]
97 .zip([2, 3, 4].iter().cloned().map(|n| {
106 assert_eq!(iter.next_back(), None);
107 assert_eq!(a, vec![1, 2, 3, 4, 6, 5]);
108 assert_eq!(b, vec![200, 300, 400]);
111 fn test_zip_cloned_sideffectful() {
112 let xs = [CountClone::new(), CountClone::new(), CountClone::new(), CountClone::new()];
113 let ys = [CountClone::new(), CountClone::new()];
115 for _ in xs.iter().cloned().zip(ys.iter().cloned()) {}
117 assert_eq!(&xs, &[1, 1, 1, 0][..]);
118 assert_eq!(&ys, &[1, 1][..]);
120 let xs = [CountClone::new(), CountClone::new()];
121 let ys = [CountClone::new(), CountClone::new(), CountClone::new(), CountClone::new()];
123 for _ in xs.iter().cloned().zip(ys.iter().cloned()) {}
125 assert_eq!(&xs, &[1, 1][..]);
126 assert_eq!(&ys, &[1, 1, 0, 0][..]);
129 fn test_zip_map_sideffectful() {
133 for _ in xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)) {}
135 assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]);
136 assert_eq!(&ys, &[1, 1, 1, 1]);
141 for _ in xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)) {}
143 assert_eq!(&xs, &[1, 1, 1, 1]);
144 assert_eq!(&ys, &[1, 1, 1, 1, 0, 0]);
147 fn test_zip_map_rev_sideffectful() {
152 let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1));
155 assert_eq!(&xs, &[0, 0, 0, 1, 1, 1]);
156 assert_eq!(&ys, &[0, 0, 0, 1]);
162 let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1));
163 (&mut it).take(5).count();
166 assert_eq!(&xs, &[1, 1, 1, 1, 1, 1]);
167 assert_eq!(&ys, &[1, 1, 1, 1]);
170 fn test_zip_nested_sideffectful() {
175 // test that it has the side effect nested inside enumerate
176 let it = xs.iter_mut().map(|x| *x = 1).enumerate().zip(&ys);
179 assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]);
182 fn test_zip_nth_back_side_effects_exhausted() {
183 let mut a = Vec::new();
184 let mut b = Vec::new();
185 let mut iter = [1, 2, 3, 4, 5, 6]
192 .zip([2, 3, 4].iter().cloned().map(|n| {
201 assert_eq!(iter.nth_back(0), None);
202 assert_eq!(a, vec![1, 2, 3, 4, 6, 5]);
203 assert_eq!(b, vec![200, 300, 400]);
206 fn test_zip_trusted_random_access_composition() {
207 let a = [0, 1, 2, 3, 4];
211 let a = a.iter().copied();
212 let b = b.iter().copied();
213 let mut c = c.iter().copied();
216 let mut z1 = a.zip(b);
217 assert_eq!(z1.next().unwrap(), (0, 0));
219 let mut z2 = z1.zip(c);
220 fn assert_trusted_random_access<T: TrustedRandomAccess>(_a: &T) {}
221 assert_trusted_random_access(&z2);
222 assert_eq!(z2.next().unwrap(), ((1, 1), 1));