@@ -78,7 +78,6 @@ object Test {
78
78
}
79
79
}
80
80
81
-
82
81
def map [B : Type ](f : (Expr [A ] => Expr [B ])): Stream [B ] = {
83
82
Stream (mapRaw[Expr [A ], Expr [B ]](a => k => ' { ~ k(f(a)) }, stream))
84
83
}
@@ -124,6 +123,25 @@ object Test {
124
123
Nested (nested.producer, (a : bt) => flatMapRaw[A , B ](f, nested.nestedf(a)))
125
124
}
126
125
}
126
+
127
+ def filter (f : (Expr [A ] => Expr [Boolean ])): Stream [A ] = {
128
+ val filterStream = (a : Expr [A ]) =>
129
+ new Producer [Expr [A ]] {
130
+ type St = Expr [A ]
131
+ val card = AtMost1
132
+
133
+ def init (k : St => Expr [Unit ]): Expr [Unit ] =
134
+ k(a)
135
+
136
+ def step (st : St , k : (Expr [A ] => Expr [Unit ])): Expr [Unit ] =
137
+ k(st)
138
+
139
+ def hasNext (st : St ): Expr [Boolean ] =
140
+ f(st)
141
+ }
142
+
143
+ Stream (flatMapRaw[Expr [A ], Expr [A ]]((a => { Linear (filterStream(a)) }), stream))
144
+ }
127
145
}
128
146
129
147
object Stream {
@@ -176,12 +194,19 @@ object Test {
176
194
.flatMap((d : Expr [Int ]) => Stream .of(' {Array (1 , 2 , 3 )}).map((dp : Expr [Int ]) => ' { ~ d * ~ dp }))
177
195
.fold(' {0 }, ((a : Expr [Int ], b : Expr [Int ]) => ' { ~ a + ~ b }))
178
196
197
+ def test4 () = Stream
198
+ .of(' {Array (1 , 2 , 3 )})
199
+ .filter((d : Expr [Int ]) => ' { ~ d % 2 == 0 })
200
+ .fold(' {0 }, ((a : Expr [Int ], b : Expr [Int ]) => ' { ~ a + ~ b }))
201
+
179
202
def main (args : Array [String ]): Unit = {
180
203
println(test1().run)
181
204
println
182
205
println(test2().run)
183
206
println
184
207
println(test3().run)
208
+ println
209
+ println(test4().run)
185
210
}
186
211
}
187
212
0 commit comments