1
- package streams
2
-
3
1
import dotty .tools .dotc .quoted .Toolbox ._
4
2
import scala .quoted ._
5
3
6
- object StagedStreams {
4
+ object Test {
7
5
8
6
// TODO: remove as it exists in Quoted Lib
9
7
sealed trait Var [T ] {
@@ -40,21 +38,24 @@ object StagedStreams {
40
38
41
39
trait StagedStream [A ]
42
40
case class Linear [A ](producer : Producer [A ]) extends StagedStream [A ]
43
- case class Nested [A , B ](producer : Producer [A ], nestedf : A => StagedStream [B ]) extends StagedStream [B ]
41
+ case class Nested [A , B ](producer : Producer [B ], nestedf : B => StagedStream [A ]) extends StagedStream [A ]
44
42
45
43
case class Stream [A ](stream : StagedStream [Expr [A ]]) {
46
- def fold [W ](z : Expr [W ], f : ((Expr [W ], Expr [A ]) => Expr [W ])): Expr [W ] = {
47
- Var (' {z}) { s =>
48
- ~ fold_raw((a : Expr [A ]) => ' {
49
- s.update(f(~ s.get, a))
50
- s.get
51
- }, stream)
52
- acc
44
+
45
+ def fold [W : Type ](z : Expr [W ], f : ((Expr [W ], Expr [A ]) => Expr [W ])): Expr [W ] = {
46
+ Var (z) { s : Var [W ] => ' {
47
+
48
+ ~ fold_raw[Expr [A ]]((a : Expr [A ]) => ' {
49
+ ~ s.update(f(s.get, a))
50
+ }, stream)
51
+
52
+ ~ s.get
53
+ }
53
54
}
54
55
}
55
56
56
- def fold_raw [W ](consumer : A => Expr [Unit ], stream : StagedStream [A ]): Expr [Unit ] = {
57
- stream match {
57
+ def fold_raw [A ](consumer : A => Expr [Unit ], s : StagedStream [A ]): Expr [Unit ] = {
58
+ s match {
58
59
case Linear (producer) => {
59
60
producer.card match {
60
61
case Many =>
@@ -71,10 +72,10 @@ object StagedStreams {
71
72
})
72
73
}
73
74
}
74
- case _ => ???
75
- // Nested(producer, nestedf) => {
76
- // ??? //consume (((a ) => consume (consumer, nestedf(a ))), Linear[A]( producer))
77
- // }
75
+ case nested : Nested [a, bt] => ???
76
+ // {
77
+ // fold_raw[bt] (((e: bt ) => fold_raw (consumer, nested. nestedf(e ))), Linear(nested. producer))
78
+ // }
78
79
}
79
80
}
80
81
}
@@ -88,7 +89,7 @@ object StagedStreams {
88
89
89
90
def init (k : St => Expr [Unit ]): Expr [Unit ] = {
90
91
Var (' {(~ arr).length}) { n =>
91
- Var (0 .toExpr){i =>
92
+ Var (0 .toExpr){ i =>
92
93
k((i, n, arr))
93
94
}
94
95
}
@@ -114,6 +115,15 @@ object StagedStreams {
114
115
Stream (Linear (prod))
115
116
}
116
117
}
118
+
119
+ def test1 () = Stream
120
+ .of(' {Array (1 , 2 , 3 )})
121
+ .fold(' {0 }, ((a : Expr [Int ], b : Expr [Int ]) => ' { ~ a + ~ b }))
122
+
123
+
124
+ def main (args : Array [String ]): Unit = {
125
+ println(test1().run)
126
+ }
117
127
}
118
128
119
129
0 commit comments