Skip to content

Commit c941599

Browse files
committed
Use type variables to get around inference issues
1 parent 2f9383e commit c941599

File tree

1 file changed

+45
-48
lines changed

1 file changed

+45
-48
lines changed

core/shared/src/main/scala/coop/ThreadT.scala

Lines changed: 45 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -121,28 +121,27 @@ object ThreadT {
121121
case Left(Dedent(results)) =>
122122
Left(LoopState(Some(results), tail, count, locks, refs, deferreds))
123123

124-
case Left(MkRef(a, id, body)) =>
125-
val ref = new Ref[Any](id)
126-
Left(LoopState(Some(() => body(ref)), tail, count, locks, refs + (id -> a), deferreds))
127-
128-
case Left(ModifyRef(ref, f, body)) =>
129-
val a = refs(ref.monitorId)
130-
val (newA, b) = f(a)
131-
Left(LoopState(Some(() => body(b)), tail, count, locks, refs.updated(ref.monitorId, newA), deferreds))
132-
133-
case Left(MkDeferred(id, body)) =>
134-
val deferred = new Deferred[Any](id)
135-
Left(LoopState(Some(() => body(deferred)), tail, count, locks, refs, deferreds))
136-
137-
case Left(TryGetDeferred(deferred, body)) =>
138-
val optA = deferreds.get(deferred.monitorId)
139-
Left(LoopState(Some(() => body(optA)), tail, count, locks, refs, deferreds))
140-
141-
case Left(CompleteDeferred(deferred, a, body)) =>
142-
Left(LoopState(Some(() => body()), tail, count, locks, refs, deferreds.updatedWith(deferred.monitorId) {
143-
case Some(oldA) => Some(oldA)
144-
case None => Some(a)
145-
}))
124+
case Left(mkref: MkRef[a, b]) =>
125+
val a = mkref.a
126+
val ref = new Ref[a](mkref.id)
127+
Left(LoopState(Some(() => mkref.body(ref)), tail, count, locks, refs + (mkref.id -> a), deferreds))
128+
129+
case Left(modifyRef: ModifyRef[a, b, c]) =>
130+
val a = refs(modifyRef.ref.monitorId).asInstanceOf[a]
131+
val (newA, b) = modifyRef.f(a)
132+
Left(LoopState(Some(() => modifyRef.body(b)), tail, count, locks, refs.updated(modifyRef.ref.monitorId, newA), deferreds))
133+
134+
case Left(mkDeferred: MkDeferred[a, b]) =>
135+
val deferred = new Deferred[a](mkDeferred.id)
136+
Left(LoopState(Some(() => mkDeferred.body(deferred)), tail, count, locks, refs, deferreds))
137+
138+
case Left(tryGetDeferred: TryGetDeferred[a, b]) =>
139+
val optA = deferreds.get(tryGetDeferred.deferred.monitorId).map(_.asInstanceOf[a])
140+
Left(LoopState(Some(() => tryGetDeferred.body(optA)), tail, count, locks, refs, deferreds))
141+
142+
case Left(completeDeferred: CompleteDeferred[a, b]) =>
143+
val newA = deferreds.get(completeDeferred.deferred.monitorId).map(_.asInstanceOf[a]).getOrElse(completeDeferred.a)
144+
Left(LoopState(Some(() => completeDeferred.body()), tail, count, locks, refs, deferreds.updated(completeDeferred.deferred.monitorId, newA)))
146145
}
147146

148147
// if we have outstanding awaits but no active fibers, then we're deadlocked
@@ -199,9 +198,9 @@ object ThreadT {
199198

200199
def drawId(id: MonitorId): String = "0x" + id.hashCode.toHexString.toUpperCase
201200

202-
def drawRef(ref: Ref[Any], a: Any): String = "Ref(id = " + drawId(ref.monitorId) + ") =" + a.toString
201+
def drawRef(ref: Ref[_], a: Any): String = "Ref(id = " + drawId(ref.monitorId) + ") =" + a.toString
203202

204-
def drawDeferred(deferred: Deferred[Any]): String = "Deferred(id = " + drawId(deferred.monitorId) + ")"
203+
def drawDeferred(deferred: Deferred[_]): String = "Deferred(id = " + drawId(deferred.monitorId) + ")"
205204

206205
case class LoopState(
207206
target: ThreadT[M, A],
@@ -274,33 +273,31 @@ object ThreadT {
274273
val acc2 = acc + drawIndent(indent2, DedentStr) + "\n"
275274
LoopState(results(), acc2, indent2, false, count, refs, deferreds).asLeft[String].pure[M]
276275

277-
case Left(MkRef(a, id, body)) =>
278-
val ref = new Ref[Any](id)
279-
val acc2 = acc + drawIndent(indent, junc + " Create ref ") + drawRef(ref, a) + "\n"
280-
LoopState(body(ref), acc2, indent, init, count, refs + (ref.monitorId -> a), deferreds).asLeft[String].pure[M]
276+
case Left(mkRef: MkRef[a, b]) =>
277+
val ref = new Ref[a](mkRef.id)
278+
val acc2 = acc + drawIndent(indent, junc + " Create ref ") + drawRef(ref, mkRef.a) + "\n"
279+
LoopState(mkRef.body(ref), acc2, indent, init, count, refs + (ref.monitorId -> mkRef.a), deferreds).asLeft[String].pure[M]
281280

282-
case Left(ModifyRef(ref, f, body)) =>
283-
val a = refs(ref.monitorId)
284-
val (newA, b) = f(a)
285-
val acc2 = acc + drawIndent(indent, junc + " Modify ref ") + drawRef(ref, newA) + ", produced " + b.toString + "\n"
286-
LoopState(body(b), acc2, indent, init, count, refs.updated(ref.monitorId, newA), deferreds).asLeft[String].pure[M]
281+
case Left(modifyRef: ModifyRef[a, b, c]) =>
282+
val a = refs(modifyRef.ref.monitorId).asInstanceOf[a]
283+
val (newA, b) = modifyRef.f(a)
284+
val acc2 = acc + drawIndent(indent, junc + " Modify ref ") + drawRef(modifyRef.ref, newA) + ", produced " + b.toString + "\n"
285+
LoopState(modifyRef.body(b), acc2, indent, init, count, refs.updated(modifyRef.ref.monitorId, newA), deferreds).asLeft[String].pure[M]
287286

288-
case Left(MkDeferred(id, body)) =>
289-
val deferred = new Deferred[Any](id)
287+
case Left(mkDeferred: MkDeferred[a, b]) =>
288+
val deferred = new Deferred[a](mkDeferred.id)
290289
val acc2 = acc + drawIndent(indent, junc + " Create deferred ") + drawDeferred(deferred) + "\n"
291-
LoopState(body(deferred), acc2, indent, init, count, refs, deferreds).asLeft[String].pure[M]
292-
293-
case Left(TryGetDeferred(deferred, body)) =>
294-
val optA = deferreds.get(deferred.monitorId)
295-
val acc2 = acc + drawIndent(indent, junc + " Try get deferred ") + drawDeferred(deferred) + " = " + optA.toString + "\n"
296-
LoopState(body(optA), acc2, indent, init, count, refs, deferreds).asLeft[String].pure[M]
297-
298-
case Left(CompleteDeferred(deferred, a, body)) =>
299-
val acc2 = acc + drawIndent(indent, junc + " Complete deferred ") + drawDeferred(deferred) + " with value " + a.toString + "\n"
300-
LoopState(body(), acc2, indent, init, count, refs, deferreds.updatedWith(deferred.monitorId) {
301-
case Some(oldA) => Some(oldA)
302-
case None => Some(a)
303-
}).asLeft[String].pure[M]
290+
LoopState(mkDeferred.body(deferred), acc2, indent, init, count, refs, deferreds).asLeft[String].pure[M]
291+
292+
case Left(tryGetDeferred: TryGetDeferred[a, b]) =>
293+
val optA = deferreds.get(tryGetDeferred.deferred.monitorId).map(_.asInstanceOf[a])
294+
val acc2 = acc + drawIndent(indent, junc + " Try get deferred ") + drawDeferred(tryGetDeferred.deferred) + " = " + optA.toString + "\n"
295+
LoopState(tryGetDeferred.body(optA), acc2, indent, init, count, refs, deferreds).asLeft[String].pure[M]
296+
297+
case Left(completeDeferred: CompleteDeferred[a, b]) =>
298+
val newA = deferreds.get(completeDeferred.deferred.monitorId).map(_.asInstanceOf[a]).getOrElse(completeDeferred.a)
299+
val acc2 = acc + drawIndent(indent, junc + " Complete deferred ") + drawDeferred(completeDeferred.deferred) + " with value " + newA.toString + "\n"
300+
LoopState(completeDeferred.body(), acc2, indent, init, count, refs, deferreds.updated(completeDeferred.deferred.monitorId, newA)).asLeft[String].pure[M]
304301

305302
case Right(a) =>
306303
(acc + drawIndent(indent, TurnRight + " Pure " + a.show + trailing)).asRight[LoopState].pure[M]

0 commit comments

Comments
 (0)