summaryrefslogtreecommitdiff
path: root/libraries/base/Control/Arrow.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/Control/Arrow.hs')
-rw-r--r--libraries/base/Control/Arrow.hs8
1 files changed, 8 insertions, 0 deletions
diff --git a/libraries/base/Control/Arrow.hs b/libraries/base/Control/Arrow.hs
index b723dd4722..f6067a01c3 100644
--- a/libraries/base/Control/Arrow.hs
+++ b/libraries/base/Control/Arrow.hs
@@ -304,11 +304,19 @@ newtype ArrowMonad a b = ArrowMonad (a () b)
instance Arrow a => Functor (ArrowMonad a) where
fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f
+instance Arrow a => Applicative (ArrowMonad a) where
+ pure x = ArrowMonad (arr (const x))
+ ArrowMonad f <*> ArrowMonad x = ArrowMonad (f &&& x >>> arr (uncurry id))
+
instance ArrowApply a => Monad (ArrowMonad a) where
return x = ArrowMonad (arr (\_ -> x))
ArrowMonad m >>= f = ArrowMonad $
m >>> arr (\x -> let ArrowMonad h = f x in (h, ())) >>> app
+instance ArrowPlus a => Alternative (ArrowMonad a) where
+ empty = ArrowMonad zeroArrow
+ ArrowMonad x <|> ArrowMonad y = ArrowMonad (x <+> y)
+
instance (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) where
mzero = ArrowMonad zeroArrow
ArrowMonad x `mplus` ArrowMonad y = ArrowMonad (x <+> y)