------------------------------------------------------------------------------
--- Kleisli arrows of a monad
-
-newtype Kleisli m a b = Kleisli (a -> m b)
-
-instance Monad m => Arrow (Kleisli m) where
- arr f = Kleisli (return . f)
- Kleisli f >>> Kleisli g = Kleisli (\b -> f b >>= g)
- first (Kleisli f) = Kleisli (\ ~(b,d) -> f b >>= \c -> return (c,d))
- second (Kleisli f) = Kleisli (\ ~(d,b) -> f b >>= \c -> return (d,c))
-
-instance MonadPlus m => ArrowZero (Kleisli m) where
- zeroArrow = Kleisli (\x -> mzero)
-
-instance MonadPlus m => ArrowPlus (Kleisli m) where
- Kleisli f <+> Kleisli g = Kleisli (\x -> f x `mplus` g x)
-
-instance Monad m => ArrowChoice (Kleisli m) where
- left f = f +++ arr id
- right f = arr id +++ f
- f +++ g = (f >>> arr Left) ||| (g >>> arr Right)
- Kleisli f ||| Kleisli g = Kleisli (either f g)
-
-instance Monad m => ArrowApply (Kleisli m) where
- app = Kleisli (\(Kleisli f, x) -> f x)
-