2 #[macro_use] extern crate itertools as it;
3 extern crate permutohedron
;
9 use it
::free
::put_back_n
;
15 let prod
= iproduct
!(0..3, 0..2, 0..2);
16 assert_eq
!(prod
.size_hint(), (12, Some(12)));
17 let v
= prod
.collect_vec();
21 assert
!((i
, j
, k
) == v
[(i
* 2 * 2 + j
* 2 + k
) as usize]);
25 for (_
, _
, _
, _
) in iproduct
!(0..3, 0..2, 0..2, 0..3) {
31 fn interleave_shortest() {
32 let v0
: Vec
<i32> = vec
![0, 2, 4];
33 let v1
: Vec
<i32> = vec
![1, 3, 5, 7];
34 let it
= v0
.into_iter().interleave_shortest(v1
.into_iter());
35 assert_eq
!(it
.size_hint(), (6, Some(6)));
36 assert_eq
!(it
.collect_vec(), vec
![0, 1, 2, 3, 4, 5]);
38 let v0
: Vec
<i32> = vec
![0, 2, 4, 6, 8];
39 let v1
: Vec
<i32> = vec
![1, 3, 5];
40 let it
= v0
.into_iter().interleave_shortest(v1
.into_iter());
41 assert_eq
!(it
.size_hint(), (7, Some(7)));
42 assert_eq
!(it
.collect_vec(), vec
![0, 1, 2, 3, 4, 5, 6]);
44 let i0
= ::std
::iter
::repeat(0);
45 let v1
: Vec
<_
> = vec
![1, 3, 5];
46 let it
= i0
.interleave_shortest(v1
.into_iter());
47 assert_eq
!(it
.size_hint(), (7, Some(7)));
49 let v0
: Vec
<_
> = vec
![0, 2, 4];
50 let i1
= ::std
::iter
::repeat(1);
51 let it
= v0
.into_iter().interleave_shortest(i1
);
52 assert_eq
!(it
.size_hint(), (6, Some(6)));
58 let xs
= ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"];
59 let ys
= ["aaa", "bbbbb", "ccc"];
60 it
::assert_equal(ys
.iter(), xs
.iter().unique_by(|x
| x
[..2].to_string()));
65 let xs
= [0, 1, 2, 3, 2, 1, 3];
66 let ys
= [0, 1, 2, 3];
67 it
::assert_equal(ys
.iter(), xs
.iter().unique());
70 it
::assert_equal(ys
.iter(), xs
.iter().unique());
75 let xs
= ["a", "", "b", "c"];
76 let v
: Vec
<&str> = xs
.iter().map(|x
| x
.clone()).intersperse(", ").collect();
77 let text
: String
= v
.concat();
78 assert_eq
!(text
, "a, , b, c".to_string());
80 let ys
= [0, 1, 2, 3];
81 let mut it
= ys
[..0].iter().map(|x
| *x
).intersperse(1);
82 assert
!(it
.next() == None
);
87 let xs
= [0, 1, 1, 1, 2, 1, 3, 3];
88 let ys
= [0, 1, 2, 1, 3];
89 it
::assert_equal(ys
.iter(), xs
.iter().dedup());
90 let xs
= [0, 0, 0, 0, 0];
92 it
::assert_equal(ys
.iter(), xs
.iter().dedup());
94 let xs
= [0, 1, 1, 1, 2, 1, 3, 3];
95 let ys
= [0, 1, 2, 1, 3];
96 let mut xs_d
= Vec
::new();
97 xs
.iter().dedup().fold((), |(), &elt
| xs_d
.push(elt
));
98 assert_eq
!(&xs_d
, &ys
);
103 assert
!(!"AABBCCC".chars().all_equal());
104 assert
!("AAAAAAA".chars().all_equal());
105 for (_key
, mut sub
) in &"AABBCCC".chars().group_by(|&x
| x
) {
106 assert
!(sub
.all_equal());
111 fn test_put_back_n() {
112 let xs
= [0, 1, 1, 1, 2, 1, 3, 3];
113 let mut pb
= put_back_n(xs
.iter().cloned());
118 it
::assert_equal(pb
, xs
.iter().cloned());
123 let xs
= [0, 1, 2, 3];
124 let (mut t1
, mut t2
) = xs
.iter().cloned().tee();
125 assert_eq
!(t1
.next(), Some(0));
126 assert_eq
!(t2
.next(), Some(0));
127 assert_eq
!(t1
.next(), Some(1));
128 assert_eq
!(t1
.next(), Some(2));
129 assert_eq
!(t1
.next(), Some(3));
130 assert_eq
!(t1
.next(), None
);
131 assert_eq
!(t2
.next(), Some(1));
132 assert_eq
!(t2
.next(), Some(2));
133 assert_eq
!(t1
.next(), None
);
134 assert_eq
!(t2
.next(), Some(3));
135 assert_eq
!(t2
.next(), None
);
136 assert_eq
!(t1
.next(), None
);
137 assert_eq
!(t2
.next(), None
);
139 let (t1
, t2
) = xs
.iter().cloned().tee();
140 it
::assert_equal(t1
, xs
.iter().cloned());
141 it
::assert_equal(t2
, xs
.iter().cloned());
143 let (t1
, t2
) = xs
.iter().cloned().tee();
144 it
::assert_equal(t1
.zip(t2
), xs
.iter().cloned().zip(xs
.iter().cloned()));
150 let xs
= [0, 1, 1, 1, 2, 1, 3, 5, 6];
152 let mut r1
= rciter(xs
.iter().cloned());
153 let mut r2
= r1
.clone();
154 assert_eq
!(r1
.next(), Some(0));
155 assert_eq
!(r2
.next(), Some(1));
156 let mut z
= r1
.zip(r2
);
157 assert_eq
!(z
.next(), Some((1, 1)));
158 assert_eq
!(z
.next(), Some((2, 1)));
159 assert_eq
!(z
.next(), Some((3, 5)));
160 assert_eq
!(z
.next(), None
);
163 let r1
= rciter(0..5);
164 let mut z
= izip
!(&r1
, r1
);
165 assert_eq
!(z
.next(), Some((0, 1)));
170 fn trait_pointers() {
171 struct ByRef
<'r
, I
: ?Sized
>(&'r
mut I
) where I
: 'r
;
173 impl<'r
, X
, I
: ?Sized
> Iterator
for ByRef
<'r
, I
> where
174 I
: 'r
+ Iterator
<Item
=X
>
177 fn next(&mut self) -> Option
<X
>
183 let mut it
= Box
::new(0..10) as Box
<Iterator
<Item
=i32>>;
184 assert_eq
!(it
.next(), Some(0));
187 /* make sure foreach works on non-Sized */
188 let jt
: &mut Iterator
<Item
= i32> = &mut *it
;
189 assert_eq
!(jt
.next(), Some(1));
192 let mut r
= ByRef(jt
);
193 assert_eq
!(r
.next(), Some(2));
196 assert_eq
!(jt
.find_position(|x
| *x
== 4), Some((1, 4)));
203 let odd
: Vec
<(u32, &str)> = vec
![(1, "hello"), (3, "world"), (5, "!")];
204 let even
= vec
![(2, "foo"), (4, "bar"), (6, "baz")];
205 let expected
= vec
![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")];
206 let results
= odd
.iter().merge_by(even
.iter(), |a
, b
| a
.0 <= b
.0);
207 it
::assert_equal(results
, expected
.iter());
211 fn merge_by_btree() {
212 use std
::collections
::BTreeMap
;
213 let mut bt1
= BTreeMap
::new();
214 bt1
.insert("hello", 1);
215 bt1
.insert("world", 3);
216 let mut bt2
= BTreeMap
::new();
217 bt2
.insert("foo", 2);
218 bt2
.insert("bar", 4);
219 let results
= bt1
.into_iter().merge_by(bt2
.into_iter(), |a
, b
| a
.0 <= b
.0 );
220 let expected
= vec
![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)];
221 it
::assert_equal(results
, expected
.into_iter());
227 let its
= (0..4).map(|s
| (s
..10).step(4));
229 it
::assert_equal(its
.kmerge(), 0..10);
235 let its
= vec
![3, 2, 1, 0].into_iter().map(|s
| (s
..10).step(4));
237 it
::assert_equal(its
.kmerge(), 0..10);
242 let its
= (0..4).map(|_
| 0..0);
243 assert_eq
!(its
.kmerge().next(), None
);
247 fn kmerge_size_hint() {
248 let its
= (0..5).map(|_
| (0..10));
249 assert_eq
!(its
.kmerge().size_hint(), (50, Some(50)));
253 fn kmerge_empty_size_hint() {
254 let its
= (0..5).map(|_
| (0..0));
255 assert_eq
!(its
.kmerge().size_hint(), (0, Some(0)));
260 let many
= [1, 2, 3];
262 let none
: Vec
<i32> = vec
![];
264 assert_eq
!(many
.iter().join(", "), "1, 2, 3");
265 assert_eq
!( one
.iter().join(", "), "1");
266 assert_eq
!(none
.iter().join(", "), "");
271 let sc
= [3, 4, 1, 2].iter().cloned().sorted_by(|&a
, &b
| {
274 it
::assert_equal(sc
, vec
![1, 2, 3, 4]);
276 let v
= (0..5).sorted_by(|&a
, &b
| a
.cmp(&b
).reverse());
277 it
::assert_equal(v
, vec
![4, 3, 2, 1, 0]);
282 let sc
= [3, 4, 1, 2].iter().cloned().sorted_by_key(|&x
| x
);
283 it
::assert_equal(sc
, vec
![1, 2, 3, 4]);
285 let v
= (0..5).sorted_by_key(|&x
| -x
);
286 it
::assert_equal(v
, vec
![4, 3, 2, 1, 0]);
290 fn test_multipeek() {
291 let nums
= vec
![1u8,2,3,4,5];
293 let mp
= multipeek(nums
.iter().map(|&x
| x
));
294 assert_eq
!(nums
, mp
.collect
::<Vec
<_
>>());
296 let mut mp
= multipeek(nums
.iter().map(|&x
| x
));
297 assert_eq
!(mp
.peek(), Some(&1));
298 assert_eq
!(mp
.next(), Some(1));
299 assert_eq
!(mp
.peek(), Some(&2));
300 assert_eq
!(mp
.peek(), Some(&3));
301 assert_eq
!(mp
.next(), Some(2));
302 assert_eq
!(mp
.peek(), Some(&3));
303 assert_eq
!(mp
.peek(), Some(&4));
304 assert_eq
!(mp
.peek(), Some(&5));
305 assert_eq
!(mp
.peek(), None
);
306 assert_eq
!(mp
.next(), Some(3));
307 assert_eq
!(mp
.next(), Some(4));
308 assert_eq
!(mp
.peek(), Some(&5));
309 assert_eq
!(mp
.peek(), None
);
310 assert_eq
!(mp
.next(), Some(5));
311 assert_eq
!(mp
.next(), None
);
312 assert_eq
!(mp
.peek(), None
);
317 fn test_multipeek_reset() {
318 let data
= [1, 2, 3, 4];
320 let mut mp
= multipeek(cloned(&data
));
321 assert_eq
!(mp
.peek(), Some(&1));
322 assert_eq
!(mp
.next(), Some(1));
323 assert_eq
!(mp
.peek(), Some(&2));
324 assert_eq
!(mp
.peek(), Some(&3));
326 assert_eq
!(mp
.peek(), Some(&2));
327 assert_eq
!(mp
.next(), Some(2));
331 fn test_multipeek_peeking_next() {
333 let nums
= vec
![1u8,2,3,4,5,6,7];
335 let mut mp
= multipeek(nums
.iter().map(|&x
| x
));
336 assert_eq
!(mp
.peeking_next(|&x
| x
!= 0), Some(1));
337 assert_eq
!(mp
.next(), Some(2));
338 assert_eq
!(mp
.peek(), Some(&3));
339 assert_eq
!(mp
.peek(), Some(&4));
340 assert_eq
!(mp
.peeking_next(|&x
| x
== 3), Some(3));
341 assert_eq
!(mp
.peek(), Some(&4));
342 assert_eq
!(mp
.peeking_next(|&x
| x
!= 4), None
);
343 assert_eq
!(mp
.peeking_next(|&x
| x
== 4), Some(4));
344 assert_eq
!(mp
.peek(), Some(&5));
345 assert_eq
!(mp
.peek(), Some(&6));
346 assert_eq
!(mp
.peeking_next(|&x
| x
!= 5), None
);
347 assert_eq
!(mp
.peek(), Some(&7));
348 assert_eq
!(mp
.peeking_next(|&x
| x
== 5), Some(5));
349 assert_eq
!(mp
.peeking_next(|&x
| x
== 6), Some(6));
350 assert_eq
!(mp
.peek(), Some(&7));
351 assert_eq
!(mp
.peek(), None
);
352 assert_eq
!(mp
.next(), Some(7));
353 assert_eq
!(mp
.peek(), None
);
358 it
::assert_equal((0..0).pad_using(1, |_
| 1), 1..2);
360 let v
: Vec
<usize> = vec
![0, 1, 2];
361 let r
= v
.into_iter().pad_using(5, |n
| n
);
362 it
::assert_equal(r
, vec
![0, 1, 2, 3, 4]);
364 let v
: Vec
<usize> = vec
![0, 1, 2];
365 let r
= v
.into_iter().pad_using(1, |_
| panic
!());
366 it
::assert_equal(r
, vec
![0, 1, 2]);
371 for (ch1
, sub
) in &"AABBCCC".chars().group_by(|&x
| x
) {
373 assert_eq
!(ch1
, ch2
);
377 for (ch1
, sub
) in &"AAABBBCCCCDDDD".chars().group_by(|&x
| x
) {
379 assert_eq
!(ch1
, ch2
);
386 let toupper
= |ch
: &char| ch
.to_uppercase().nth(0).unwrap();
388 // try all possible orderings
389 for indices
in permutohedron
::Heap
::new(&mut [0, 1, 2, 3]) {
390 let groups
= "AaaBbbccCcDDDD".chars().group_by(&toupper
);
391 let mut subs
= groups
.into_iter().collect_vec();
393 for &idx
in &indices
[..] {
394 let (key
, text
) = match idx
{
395 0 => ('A'
, "Aaa".chars()),
396 1 => ('B'
, "Bbb".chars()),
397 2 => ('C'
, "ccCc".chars()),
398 3 => ('D'
, "DDDD".chars()),
401 assert_eq
!(key
, subs
[idx
].0);
402 it
::assert_equal(&mut subs
[idx
].1, text
);
406 let groups
= "AAABBBCCCCDDDD".chars().group_by(|&x
| x
);
407 let mut subs
= groups
.into_iter().map(|(_
, g
)| g
).collect_vec();
409 let sd
= subs
.pop().unwrap();
410 let sc
= subs
.pop().unwrap();
411 let sb
= subs
.pop().unwrap();
412 let sa
= subs
.pop().unwrap();
413 for (a
, b
, c
, d
) in multizip((sa
, sb
, sc
, sd
)) {
420 // check that the key closure is called exactly n times
424 for (_
, sub
) in &text
.chars().group_by(|&x
| { ntimes += 1; x}
) {
428 assert_eq
!(ntimes
, text
.len());
434 for _
in &text
.chars().group_by(|&x
| { ntimes += 1; x}
) {
436 assert_eq
!(ntimes
, text
.len());
440 let text
= "ABCCCDEEFGHIJJKK";
441 let gr
= text
.chars().group_by(|&x
| x
);
442 it
::assert_equal(gr
.into_iter().flat_map(|(_
, sub
)| sub
), text
.chars());
447 fn group_by_lazy_2() {
448 let data
= vec
![0, 1];
449 let groups
= data
.iter().group_by(|k
| *k
);
450 let gs
= groups
.into_iter().collect_vec();
451 it
::assert_equal(data
.iter(), gs
.into_iter().flat_map(|(_k
, g
)| g
));
453 let data
= vec
![0, 1, 1, 0, 0];
454 let groups
= data
.iter().group_by(|k
| *k
);
455 let mut gs
= groups
.into_iter().collect_vec();
457 it
::assert_equal(&[0, 0, 0, 1, 1], gs
.into_iter().flat_map(|(_
, g
)| g
));
459 let grouper
= data
.iter().group_by(|k
| *k
);
460 let mut groups
= Vec
::new();
461 for (k
, group
) in &grouper
{
466 it
::assert_equal(&mut groups
[0], &[1, 1]);
468 let data
= vec
![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3];
469 let grouper
= data
.iter().group_by(|k
| *k
);
470 let mut groups
= Vec
::new();
471 for (i
, (_
, group
)) in grouper
.into_iter().enumerate() {
481 it
::assert_equal(&mut groups
[0], &[0, 0, 0]);
482 it
::assert_equal(&mut groups
[1], &[1, 1]);
483 it
::assert_equal(&mut groups
[2], &[3, 3]);
485 // use groups as chunks
486 let data
= vec
![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3];
488 let grouper
= data
.iter().group_by(move |_
| { let k = i / 3; i += 1; k }
);
489 for (i
, group
) in &grouper
{
491 0 => it
::assert_equal(group
, &[0, 0, 0]),
492 1 => it
::assert_equal(group
, &[1, 1, 0]),
493 2 => it
::assert_equal(group
, &[0, 2, 2]),
494 3 => it
::assert_equal(group
, &[3, 3]),
501 fn group_by_lazy_3() {
502 // test consuming each group on the lap after it was produced
503 let data
= vec
![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2];
504 let grouper
= data
.iter().group_by(|elt
| *elt
);
506 for (key
, group
) in &grouper
{
507 if let Some(gr
) = last
.take() {
509 assert
!(elt
!= key
&& i32::abs(elt
- key
) == 1);
518 let data
= vec
![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3];
519 let grouper
= data
.iter().chunks(3);
520 for (i
, chunk
) in grouper
.into_iter().enumerate() {
522 0 => it
::assert_equal(chunk
, &[0, 0, 0]),
523 1 => it
::assert_equal(chunk
, &[1, 1, 0]),
524 2 => it
::assert_equal(chunk
, &[0, 2, 2]),
525 3 => it
::assert_equal(chunk
, &[3, 3]),
533 let data
: Vec
<Vec
<()>> = Vec
::new();
534 assert_eq
!(data
.into_iter().concat(), Vec
::new())
538 fn concat_non_empty() {
539 let data
= vec
![vec
![1,2,3], vec
![4,5,6], vec
![7,8,9]];
540 assert_eq
!(data
.into_iter().concat(), vec
![1,2,3,4,5,6,7,8,9])
545 assert
!((1..3).combinations(5).next().is_none());
547 let it
= (1..3).combinations(2);
548 it
::assert_equal(it
, vec
![
552 let it
= (1..5).combinations(2);
553 it
::assert_equal(it
, vec
![
562 it
::assert_equal((0..0).tuple_combinations
::<(_
, _
)>(), <Vec
<_
>>::new());
563 it
::assert_equal((0..1).tuple_combinations
::<(_
, _
)>(), <Vec
<_
>>::new());
564 it
::assert_equal((0..2).tuple_combinations
::<(_
, _
)>(), vec
![(0, 1)]);
566 it
::assert_equal((0..0).combinations(2), <Vec
<Vec
<_
>>>::new());
567 it
::assert_equal((0..1).combinations(1), vec
![vec
![0]]);
568 it
::assert_equal((0..2).combinations(1), vec
![vec
![0], vec
![1]]);
569 it
::assert_equal((0..2).combinations(2), vec
![vec
![0, 1]]);
573 fn combinations_of_too_short() {
575 assert
!((0..0).combinations(i
).next().is_none());
576 assert
!((0..i
- 1).combinations(i
).next().is_none());
582 fn combinations_zero() {
583 it
::assert_equal((1..3).combinations(0), vec
![vec
![]]);
588 let a
= vec
![1, 2, 3, 4];
589 let b
= vec
![1.0, 5.0, 3.0, 4.0];
590 let b_map
= b
.into_iter().map(|f
| f
as i32);
591 let diff
= it
::diff_with(a
.iter(), b_map
, |a
, b
| *a
== b
);
594 Some(it
::Diff
::FirstMismatch(1, _
, from_diff
)) =>
595 from_diff
.collect
::<Vec
<_
>>() == vec
![5, 3, 4],
602 let a
= vec
![1, 2, 3, 4];
603 let b
= vec
![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
604 let b_map
= b
.into_iter().map(|f
| f
as i32);
605 let diff
= it
::diff_with(a
.iter(), b_map
, |a
, b
| *a
== b
);
608 Some(it
::Diff
::Longer(_
, remaining
)) =>
609 remaining
.collect
::<Vec
<_
>>() == vec
![5, 6],
616 let a
= vec
![1, 2, 3, 4];
617 let b
= vec
![1.0, 2.0];
618 let b_map
= b
.into_iter().map(|f
| f
as i32);
619 let diff
= it
::diff_with(a
.iter(), b_map
, |a
, b
| *a
== b
);
622 Some(it
::Diff
::Shorter(len
, _
)) => len
== 2,
629 use std
::cmp
::Ordering
;
630 use it
::MinMaxResult
;
632 // A peculiar type: Equality compares both tuple items, but ordering only the
633 // first item. This is so we can check the stability property easily.
634 #[derive(Clone, Debug, PartialEq, Eq)]
635 struct Val(u32, u32);
637 impl PartialOrd
<Val
> for Val
{
638 fn partial_cmp(&self, other
: &Val
) -> Option
<Ordering
> {
639 self.0.partial_cmp(&other
.0)
644 fn cmp(&self, other
: &Val
) -> Ordering
{
649 assert_eq
!(None
::<Option
<u32>>.iter().minmax(), MinMaxResult
::NoElements
);
651 assert_eq
!(Some(1u32).iter().minmax(), MinMaxResult
::OneElement(&1));
653 let data
= vec
![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)];
655 let minmax
= data
.iter().minmax();
656 assert_eq
!(minmax
, MinMaxResult
::MinMax(&Val(0, 1), &Val(2, 1)));
658 let (min
, max
) = data
.iter().minmax_by_key(|v
| v
.1).into_option().unwrap();
659 assert_eq
!(min
, &Val(2, 0));
660 assert_eq
!(max
, &Val(0, 2));
662 let (min
, max
) = data
.iter().minmax_by(|x
, y
| x
.1.cmp(&y
.1)).into_option().unwrap();
663 assert_eq
!(min
, &Val(2, 0));
664 assert_eq
!(max
, &Val(0, 2));
669 let data
= [0, 1, 2, 3];
670 let ans1
= "0, 1, 2, 3";
671 let ans2
= "0--1--2--3";
673 let t1
= format
!("{}", data
.iter().format(", "));
674 assert_eq
!(t1
, ans1
);
675 let t2
= format
!("{:?}", data
.iter().format("--"));
676 assert_eq
!(t2
, ans2
);
678 let dataf
= [1.1, 2.71828, -22.];
679 let t3
= format
!("{:.2e}", dataf
.iter().format(", "));
680 assert_eq
!(t3
, "1.10e0, 2.72e0, -2.20e1");
685 let ns
= (1..10).map(|x
| if x
% 5 != 0 { Some(x) }
else { None }
)
687 it
::assert_equal(ns
, vec
![1, 2, 3, 4]);
693 let mut iterations
= 0;
694 let vec
= vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
695 let sum
= vec
.into_iter().fold_while(0, |acc
, item
| {
697 let new_sum
= acc
.clone() + item
;
699 FoldWhile
::Continue(new_sum
)
704 assert_eq
!(iterations
, 6);
717 "0 1 x 2 3 x x 4 5 x x",
718 "0 1 x 2 3 x x 4 5 x 6 x x",
719 "0 1 x 2 3 x x 4 5 x 6 7 x x x",
720 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 x",
721 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x x",
722 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 x x",
723 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x x",
724 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 x x",
725 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x x x",
726 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 x x x",
727 "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 15 x x x x",
729 for (i
, &s
) in x
.iter().enumerate() {
730 let expected
= if s
== "" { None }
else { Some(s.to_string()) }
;
731 let num_strings
= (0..i
).map(|x
| x
.to_string());
732 let actual
= num_strings
.tree_fold1(|a
, b
| format
!("{} {} x", a
, b
));
733 assert_eq
!(actual
, expected
);