@@ -11,10 +11,11 @@ import Prelude
1111import Control.Alt (Alt )
1212import Control.Alternative (Alternative )
1313import 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 ())
1516import Control.Plus (Plus , empty )
1617
17- import Data.Either (either )
18+ import Data.Either (Either (), either )
1819import Data.Monoid (Monoid , mempty )
1920
2021newtype Par e a = Par (AffAVar e a )
@@ -34,10 +35,12 @@ instance functorPar :: Functor (Par e) where
3435
3536instance applyPar :: Apply (Par e ) where
3637 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)
3740 vf <- makeVar
3841 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)
4144 (takeVar vf <*> takeVar va) `cancelWith` (c1 <> c2)
4245
4346instance applicativePar :: Applicative (Par e ) where
0 commit comments