@@ -16,17 +16,17 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
1616 case ModuleDecl(path, includes, declarations, externs, definitions, exports) => {
1717 // Find constraints in the definitions
1818 val monoFindContext = MonoFindContext()
19- val constraints = findConstraints(definitions)(using monoFindContext)
20- val declConstraints = declarations map (findConstraints(_)(using monoFindContext))
21- // println("Constraints")
22- // constraints.foreach(c => println(c))
23- // println()
19+ var constraints = findConstraints(definitions)(using monoFindContext)
20+ constraints = constraints ++ declarations.flatMap (findConstraints(_)(using monoFindContext))
21+ println("Constraints")
22+ constraints.foreach(c => println(c))
23+ println()
2424
2525 // Solve collected constraints
2626 val solution = solveConstraints(constraints)
27- // println("Solved")
28- // solution.foreach(println)
29- // println()
27+ println("Solved")
28+ solution.foreach(println)
29+ println()
3030
3131 // Monomorphize existing definitions
3232 var monoNames: MonoNames = Map.empty
@@ -39,9 +39,9 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
3939 var monoContext = MonoContext(solution, monoNames)
4040 val monoDecls = declarations flatMap (monomorphize(_)(using monoContext))
4141 val monoDefs = monomorphize(definitions)(using monoContext)
42- // println(util.show(monoDecls ))
43- // println()
44- // println(util.show(monoDefs ))
42+ monoDecls.foreach(decl => println(util.show(decl) ))
43+ println()
44+ monoDefs.foreach(defn => println(util.show(defn) ))
4545 val newModuleDecl = ModuleDecl(path, includes, monoDecls, externs, monoDefs, exports)
4646 return Some(CoreTransformed(source, tree, mod, newModuleDecl))
4747 }
@@ -60,7 +60,7 @@ type Solution = Map[FunctionId, Set[Vector[TypeArg.Base]]]
6060type MonoNames = Map[(FunctionId, Vector[TypeArg.Base]), FunctionId]
6161
6262enum TypeArg {
63- case Base(val tpe: Id)
63+ case Base(val tpe: Id, targs: List[TypeArg] )
6464 case Var(funId: FunctionId, pos: Int)
6565}
6666
@@ -89,14 +89,19 @@ def findConstraints(definition: Toplevel)(using ctx: MonoFindContext): Constrain
8989 case Toplevel.Val(id, tpe, binding) => ???
9090
9191def findConstraints(declaration: Declaration)(using ctx: MonoFindContext): Constraints = declaration match
92- case Data(id, List(), constructors) => List.empty
92+ // Maybe[T] { Just[](x: T) }
9393 case Data(id, tparams, constructors) =>
9494 tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
95- constructors.map((constr =>
96- Constraint(((constr.fields map (_.tpe)) map findId).toVector, constr.id)))
95+ constructors.map{ constr =>
96+ val arity = tparams.size // + constr.tparams.size
97+ val constructorArgs = (0 until arity).map(index =>
98+ TypeArg.Var(constr.id, index) // Just.0
99+ ).toVector // < Just.0 >
100+ Constraint(constructorArgs, id) // < Just.0 > <: Maybe
101+ }
97102 case Interface(id, List(), properties) => List.empty
98103 case Interface(id, tparams, properties) =>
99- tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
104+ // tparams.zipWithIndex.foreach(ctx.extendTypingContext(_, _, id))
100105 List.empty
101106
102107def findConstraints(block: Block)(using ctx: MonoFindContext): Constraints = block match
@@ -147,12 +152,13 @@ def findConstraints(expr: Expr)(using ctx: MonoFindContext): Constraints = expr
147152 case PureApp(b, List(), vargs) => List.empty
148153 case ValueVar(id, annotatedType) => List.empty
149154 case Literal(value, annotatedType) => List.empty
150- case Make(data, tag, targs, vargs) => List(Constraint(data.targs.map(findId).toVector, data.name))
155+ case Make(data, tag, targs, vargs) =>
156+ List(Constraint(data.targs.map(findId).toVector, tag)) // <Int> <: Just
151157 case o => println(o); ???
152158
153159def findId(vt: ValueType)(using ctx: MonoFindContext): TypeArg = vt match
154160 case ValueType.Boxed(tpe, capt) => ???
155- case ValueType.Data(name, targs) => TypeArg.Base(name)
161+ case ValueType.Data(name, targs) => TypeArg.Base(name, targs map findId )
156162 case ValueType.Var(name) => ctx.typingContext(name)
157163
158164def solveConstraints(constraints: Constraints): Solution =
0 commit comments