Skip to content

Commit 8769aff

Browse files
committed
Cancel the other branch when there's succeess in a race
1 parent 23797b4 commit 8769aff

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

src/Control/Monad/Aff.purs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import Data.Foldable (class Foldable, foldl)
3939
import Data.Function.Uncurried (Fn2, Fn3, runFn2, runFn3)
4040
import Data.Monoid (class Monoid, mempty)
4141
import Data.Newtype (class Newtype)
42+
import Data.Tuple (Tuple(..), fst, snd)
4243

4344
import Unsafe.Coerce (unsafeCoerce)
4445

@@ -244,11 +245,18 @@ instance altParAff :: Alt (ParAff e) where
244245
alt (ParAff a1) (ParAff a2) = ParAff do
245246
va <- makeVar -- the `a` value
246247
ve <- makeVar -- the error count (starts at 0)
248+
cs <- makeVar -- the cancelers
247249
putVar ve 0
248-
c1 <- forkAff $ either (maybeKill va ve) (putVar va) =<< attempt a1
249-
c2 <- forkAff $ either (maybeKill va ve) (putVar va) =<< attempt a2
250+
c1 <- forkAff $ either (maybeKill va ve) (done cs snd va) =<< attempt a1
251+
c2 <- forkAff $ either (maybeKill va ve) (done cs fst va) =<< attempt a2
252+
putVar cs (Tuple c1 c2)
250253
takeVar va `cancelWith` (c1 <> c2)
251254
where
255+
done :: forall a. AVar (Tuple (Canceler e) (Canceler e)) -> (forall x. Tuple x x -> x) -> AVar a -> a -> Aff e Unit
256+
done cs get va x = do
257+
putVar va x
258+
c <- get <$> takeVar cs
259+
void $ cancel c (error "Alt early exit")
252260
maybeKill :: forall a. AVar a -> AVar Int -> Error -> Aff e Unit
253261
maybeKill va ve err = do
254262
e <- takeVar ve

0 commit comments

Comments
 (0)