@@ -11,10 +11,11 @@ import Prelude
11
11
import Control.Alt (Alt )
12
12
import Control.Alternative (Alternative )
13
13
import Control.Monad.Aff (attempt , cancelWith , forkAff )
14
- import Control.Monad.Aff.AVar (AffAVar (), makeVar , makeVar' , takeVar , putVar , killVar )
14
+ import Control.Monad.Aff.AVar (AffAVar (), AVar (), makeVar , makeVar' , takeVar , putVar , killVar )
15
+ import Control.Monad.Eff.Exception (Error ())
15
16
import Control.Plus (Plus , empty )
16
17
17
- import Data.Either (either )
18
+ import Data.Either (Either (), either )
18
19
import Data.Monoid (Monoid , mempty )
19
20
20
21
newtype Par e a = Par (AffAVar e a )
@@ -34,10 +35,12 @@ instance functorPar :: Functor (Par e) where
34
35
35
36
instance applyPar :: Apply (Par e ) where
36
37
apply (Par ff) (Par fa) = Par do
38
+ let putOrKill :: forall b . AVar b -> Either Error b -> AffAVar e Unit
39
+ putOrKill v = either (killVar v) (putVar v)
37
40
vf <- makeVar
38
41
va <- makeVar
39
- c1 <- forkAff (ff >>= putVar vf)
40
- c2 <- forkAff (fa >>= putVar va)
42
+ c1 <- forkAff (attempt ff >>= putOrKill vf)
43
+ c2 <- forkAff (attempt fa >>= putOrKill va)
41
44
(takeVar vf <*> takeVar va) `cancelWith` (c1 <> c2)
42
45
43
46
instance applicativePar :: Applicative (Par e ) where
0 commit comments