@@ -121,28 +121,27 @@ object ThreadT {
121
121
case Left (Dedent (results)) =>
122
122
Left (LoopState (Some (results), tail, count, locks, refs, deferreds))
123
123
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)))
146
145
}
147
146
148
147
// if we have outstanding awaits but no active fibers, then we're deadlocked
@@ -199,9 +198,9 @@ object ThreadT {
199
198
200
199
def drawId (id : MonitorId ): String = " 0x" + id.hashCode.toHexString.toUpperCase
201
200
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
203
202
204
- def drawDeferred (deferred : Deferred [Any ]): String = " Deferred(id = " + drawId(deferred.monitorId) + " )"
203
+ def drawDeferred (deferred : Deferred [_ ]): String = " Deferred(id = " + drawId(deferred.monitorId) + " )"
205
204
206
205
case class LoopState (
207
206
target : ThreadT [M , A ],
@@ -274,33 +273,31 @@ object ThreadT {
274
273
val acc2 = acc + drawIndent(indent2, DedentStr ) + " \n "
275
274
LoopState (results(), acc2, indent2, false , count, refs, deferreds).asLeft[String ].pure[M ]
276
275
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 ]
281
280
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 ]
287
286
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)
290
289
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 ]
304
301
305
302
case Right (a) =>
306
303
(acc + drawIndent(indent, TurnRight + " Pure " + a.show + trailing)).asRight[LoopState ].pure[M ]
0 commit comments