@@ -46,18 +46,54 @@ gen fn generator(b: i64, c: i64) Iterator<i64> {
46
46
47
47
var effect1 = 1;
48
48
var effect2 = 2;
49
+ var eff_ret = 10086;
50
+
51
+ gen fn generator1() Iterator<(i64, |*||=>void,*||=>void| =>void)> {
52
+ let retgen2 = 0;
53
+ let generator = generator2();
54
+ while true {
55
+ let nx = generator.next();
56
+ if nx is None {
57
+ break;
58
+ }
59
+ let nx_v = nx as (i64, |*||=>void,*||=>void| =>void)!;
60
+ match nx_v {
61
+ (10086, f) => {
62
+ let wrapped_f = |iter:*||=>void,handler:*||=>void| => {
63
+ let real_handler = unsafe_cast<|||=>void|=>void>(handler);
64
+ let ret_handler = |resolve:||=>void, ret|=>{
65
+ retgen2 = ret;
66
+ (*real_handler)(resolve);
67
+ return;
68
+ };
69
+ let clp = &ret_handler;
70
+ let arg2 = unsafe_cast<||=>void>(clp);
71
+ f(iter,arg2);
72
+
73
+ return;
74
+ };
75
+ let yr= (eff_ret,wrapped_f);
76
+ yield return yr;
77
+ break;
78
+ }
79
+ yr => {
80
+ yield return yr;
81
+ }
82
+ }
83
+ }
84
+
85
+ println!("got retgen2 ", retgen2);
86
+
49
87
50
- gen fn generator1() Iterator<(i64, |*Iterator<()>,*||=>void| =>void)> {
51
88
// executeGenerator(generator2());
52
- let a = 1 ;
89
+ let a = retgen2 ;
53
90
let re = 0;
54
91
55
- let f = |iter:*Iterator<()> ,handler:*||=>void| => {
92
+ let f = |next:*||=>void ,handler:*||=>void| => {
56
93
let real_handler = unsafe_cast<||i64|=>void,i64|=>void>(handler);
57
94
let resolve = |ret|=> {
58
95
re = ret;
59
- println!(ret);
60
- (*iter).next();
96
+ (*next)();
61
97
return;
62
98
};
63
99
(*real_handler)(resolve,a);
@@ -70,26 +106,82 @@ gen fn generator1() Iterator<(i64, |*Iterator<()>,*||=>void| =>void)> {
70
106
}
71
107
72
108
73
- fn executeGenerator(g:Iterator<(i64, |*Iterator<()>,*||=>void| =>void)>) void {
109
+ gen fn generator2() Iterator<(i64, |*||=>void,*||=>void| =>void)> {
110
+ // executeGenerator(generator2());
111
+ let a = 1;
112
+ let re = 0;
113
+
114
+ let f = |next:*||=>void,handler:*||=>void| => {
115
+ let real_handler = unsafe_cast<||i64|=>void,i64|=>void>(handler);
116
+ let resolve = |ret|=> {
117
+ re = ret;
118
+ (*next)();
119
+ return;
120
+ };
121
+ (*real_handler)(resolve,a);
122
+
123
+ return;
124
+ };
125
+ let yr= (effect1,f);
126
+ yield return yr;
127
+ println!("g2 got re ", re);
128
+
129
+ f = |next:*||=>void,handler:*||=>void| => {
130
+ let real_handler = unsafe_cast<|||=>void,i64|=>void>(handler);
131
+ let resolve = ||=> {
132
+ (*next)();
133
+ return;
134
+ };
135
+ (*real_handler)(resolve,100);
136
+
137
+ return;
138
+ };
139
+ // return
140
+ yr= (eff_ret,f);
141
+ yield return yr;
142
+ }
143
+
144
+
145
+ fn executeGenerator(g:Iterator<(i64, |*||=>void,*||=>void| =>void)>) void {
74
146
let eff = g.next();
75
147
if eff is None {
148
+ println!("ret none");
76
149
return;
77
150
}
78
- match eff as (i64, |*Iterator<()> ,*||=>void| =>void)! {
151
+ match eff as (i64, |*||=>void ,*||=>void| =>void)! {
79
152
(1,r) => {
153
+ println!("handle eff1");
80
154
let cl =|resolve, a| => {
81
155
eff1handler(resolve, a);
82
156
return;
83
157
};
84
- let it = &g;
158
+ let next = & ||=>{
159
+ executeGenerator(g);
160
+ return;
161
+ };
85
162
let clp = &cl;
86
- let arg1 = unsafe_cast<Iterator<()>>(it);
87
163
let arg2 = unsafe_cast<||=>void>(clp);
88
- r(arg1 ,arg2);
164
+ r(next ,arg2);
89
165
}
90
166
(2,r) => {
167
+ println!("handle eff2");
168
+ }
169
+ (10086,r) => {
170
+ println!("handle effret");
171
+ let cl =|resolve:||=>void| => {
172
+ resolve();
173
+ return;
174
+ };
175
+ let next = & ||=>{
176
+ executeGenerator(g);
177
+ return;
178
+ };
179
+ let clp = &cl;
180
+ let arg2 = unsafe_cast<||=>void>(clp);
181
+ r(next,arg2);
91
182
}
92
- _ => {
183
+ (n, f) => {
184
+ println!("handle eff", n);
93
185
}
94
186
}
95
187
return;
@@ -109,7 +201,3 @@ fn eff2handler(resolve: ||=>void) void {
109
201
return;
110
202
}
111
203
112
-
113
- gen fn generator2() Iterator<i64> {
114
- yield return effect2;
115
- }
0 commit comments