@@ -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