1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
mod tests {
use gen::Callable;
use iter::ReturnIterExt;
use ::std::ops::{GeneratorState, Generator};
// #[test]
// fn __test_generator_into_iterator() {
// let mut g = Callable::new(|| {
// yield_from!(|| {
// for i in (0..5u8) {
// yield i as char;
// }
// });
// return 99
// }).iter_all();
// assert_eq!(g.next(), Some(0 as char));
// assert_eq!(g.next(), Some(1 as char));
// assert_eq!(g.next(), Some(2 as char));
// assert_eq!(g.next(), Some(3 as char));
// assert_eq!(g.next(), Some(4 as char));
// assert_eq!(g.next(), Some('c'));
// }
#[test]
fn test_generator_into_iterator() {
let mut char_yielder = || {
for i in 0..5u8 {
yield i as char;
}
};
let mut callable = Callable::new(|| {
yield_from!(char_yielder);
return 99
});
{
let mut g = (&mut callable).iter_all().take(4);
assert_eq!(g.next(), Some(0 as char));
assert_eq!(g.next(), Some(1 as char));
assert_eq!(g.next(), Some(2 as char));
assert_eq!(g.next(), Some(3 as char));
assert_eq!(g.next(), None);
}
let mut resumed = callable.iter_all();
assert_eq!(resumed.next(), Some(4 as char));
assert_eq!(resumed.next(), Some('c'));
assert_eq!(resumed.next(), None);
}
#[test]
fn test_chain() {
let generator = Callable::new(move || {
yield 1;
yield 2;
return 3;
});
let chain_once = generator.chain(|input| {
move || {
yield input * 2;
return input;
}
}).unwrap();
let chain_twice = chain_once.chain(|mut input| {
move || {
yield input * 10;
input *= 10;
input - 1
}
}).unwrap();
let mut iter = chain_twice.iter_all();
assert_eq!(iter.next(), Some(1)); // yield 1;
assert_eq!(iter.next(), Some(2)); // yield 2
assert_eq!(iter.next(), Some(6)); // yield input * 2;
assert_eq!(iter.next(), Some(30)); // yield input * 10;
assert_eq!(iter.next(), Some(29)); // in the last generator we do input *= 10 (results in input being 30), and then we return 'input - 1'
assert_eq!(iter.next(), None);
}
#[test]
fn make_new() {
let mut generator = Callable::new(|| {
for i in 0..10 {
yield i;
}
return 2;
});
{
let mut iter = generator.borrow_mut(|gen| {
move || {
let sum = gen.iter_all().take(3).sum();
for i in 0..sum {
yield i;
}
return 0;
}
}).unwrap().iter_all();
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next(), None);
}
let mut iter = generator.iter_all();
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next(), Some(5));
assert_eq!(iter.next(), Some(6));
assert_eq!(iter.next(), Some(7));
assert_eq!(iter.next(), Some(8));
assert_eq!(iter.next(), Some(9));
assert_eq!(iter.next(), Some(2));
}
}