Skip to content

Commit 658722d

Browse files
committed
Implement solveConstraints
1 parent 960ea3f commit 658722d

File tree

1 file changed

+28
-3
lines changed
  • effekt/shared/src/main/scala/effekt/core

1 file changed

+28
-3
lines changed

effekt/shared/src/main/scala/effekt/core/Mono.scala

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,17 @@ object Mono extends Phase[CoreTransformed, CoreTransformed] {
1414
case CoreTransformed(source, tree, mod, core) => {
1515
core match {
1616
case ModuleDecl(path, includes, declarations, externs, definitions, exports) => {
17-
val polys = findConstraints(definitions)
18-
polys.foreach(p => println(p))
17+
val constraints = findConstraints(definitions)
18+
println("Constraints")
19+
constraints.foreach(c => println(c))
1920
println()
20-
println("Has cycle: " + hasCycle(polys))
21+
if (!hasCycle(constraints)) {
22+
val solvedConstraints = solveConstraints(constraints)
23+
println("Solved constraints")
24+
solvedConstraints.foreach(sc => println(sc))
25+
} else {
26+
println("Cycle detected, skipping solveConstraints")
27+
}
2128
println()
2229
}
2330
}
@@ -44,6 +51,24 @@ enum PolyType {
4451
type PolyConstraints = Map[symbols.Symbol, Set[PolyType]]
4552
type PolyConstraintEntry = (symbols.Symbol, Set[PolyType])
4653

54+
def solveConstraints(constraints: PolyConstraints): PolyConstraints =
55+
var solved: PolyConstraints = Map()
56+
57+
def solveConstraint(sym: symbols.Symbol, types: Set[PolyType]): Set[PolyType] =
58+
var polyTypes: Set[PolyType] = Set()
59+
types.foreach(t => {
60+
t match {
61+
case PolyType.Var(symbol) => polyTypes ++= solved.getOrElse(symbol, solveConstraint(symbol, constraints.getOrElse(symbol, Set())))
62+
case base => polyTypes += base
63+
}
64+
})
65+
solved += (sym -> polyTypes)
66+
polyTypes
67+
68+
constraints.foreach(solveConstraint)
69+
70+
solved
71+
4772
def appendConstraint(map: PolyConstraints, sym: symbols.Symbol, tpe: ValueType): PolyConstraintEntry =
4873
val currentFlow = map.getOrElse(sym, Set())
4974
tpe match {

0 commit comments

Comments
 (0)