@@ -48,50 +48,48 @@ trait GenConcurrent[F[_], E] extends GenSpawn[F, E] {
4848 // start running the effect, or subscribe if it already is
4949 def evalOrSubscribe : F [A ] =
5050 deferred[Fiber [F , E , A ]] flatMap { deferredFiber =>
51- uncancelable { poll =>
52- state.modify {
53- case Unevaluated () =>
54- // run the effect, and if this fiber is still relevant set its result
55- val go = {
56- def tryComplete (result : Memoize [F , E , A ]): F [Unit ] = state.update {
57- case Evaluating (fiber, _) if fiber eq deferredFiber =>
58- // we are the blessed fiber of this memo
59- result
60- case other => // our outcome is no longer relevant
61- other
62- }
63-
64- fa
65- // hack around functor law breakage
66- .flatMap(F .pure(_))
67- .handleErrorWith(F .raiseError(_))
68- // end hack
69- .guaranteeCase {
70- case Outcome .Canceled () =>
71- tryComplete(Finished (Right (productR(canceled)(never))))
72- case Outcome .Errored (err) =>
73- tryComplete(Finished (Left (err)))
74- case Outcome .Succeeded (fa) =>
75- tryComplete(Finished (Right (fa)))
76- }
51+ state.flatModifyFull {
52+ case (poll, Unevaluated ()) =>
53+ // run the effect, and if this fiber is still relevant set its result
54+ val go = {
55+ def tryComplete (result : Memoize [F , E , A ]): F [Unit ] = state.update {
56+ case Evaluating (fiber, _) if fiber eq deferredFiber =>
57+ // we are the blessed fiber of this memo
58+ result
59+ case other => // our outcome is no longer relevant
60+ other
7761 }
7862
79- val eval = go.start.flatMap { fiber =>
80- deferredFiber.complete(fiber) *>
81- poll(fiber.join.flatMap(_.embed(productR(canceled)(never))))
82- .onCancel(unsubscribe(deferredFiber))
83- }
63+ fa
64+ // hack around functor law breakage
65+ .flatMap(F .pure(_))
66+ .handleErrorWith(F .raiseError(_))
67+ // end hack
68+ .guaranteeCase {
69+ case Outcome .Canceled () =>
70+ tryComplete(Finished (Right (productR(canceled)(never))))
71+ case Outcome .Errored (err) =>
72+ tryComplete(Finished (Left (err)))
73+ case Outcome .Succeeded (fa) =>
74+ tryComplete(Finished (Right (fa)))
75+ }
76+ }
77+
78+ val eval = go.start.flatMap { fiber =>
79+ deferredFiber.complete(fiber) *>
80+ poll(fiber.join.flatMap(_.embed(productR(canceled)(never))))
81+ .onCancel(unsubscribe(deferredFiber))
82+ }
8483
85- Evaluating (deferredFiber, 1 ) -> eval
84+ Evaluating (deferredFiber, 1 ) -> eval
8685
87- case Evaluating (fiber, subscribers) =>
88- Evaluating (fiber, subscribers + 1 ) ->
89- poll(fiber.get.flatMap(_.join).flatMap(_.embed(productR(canceled)(never))))
90- .onCancel(unsubscribe(fiber))
86+ case (poll, Evaluating (fiber, subscribers) ) =>
87+ Evaluating (fiber, subscribers + 1 ) ->
88+ poll(fiber.get.flatMap(_.join).flatMap(_.embed(productR(canceled)(never))))
89+ .onCancel(unsubscribe(fiber))
9190
92- case finished @ Finished (result) =>
93- finished -> fromEither(result).flatten
94- }.flatten
91+ case (_, finished @ Finished (result)) =>
92+ finished -> fromEither(result).flatten
9593 }
9694 }
9795
0 commit comments