Kleislify-0.0.1: Control/Kleislify.hs
-------------------------------------------------------------------------
-- |
-- Module : Control.Kleislify
-- Copyright : (c) Dylan Just, 2011
-- License : BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer : dylan@techtangents.com
-- Stability : experimental
-- Portability : portable
--
-- Variants of Control.Arrow functions, specialised to kleislis.
-- Avoids boxing into Kleisli values.
module Control.Kleislify where
import Control.Arrow
infixr 1 ^=>, =>^
infixr 1 ^<=, <=^
-- | Kleisli precomposition of a monad with a pure function.
-- Equivalent to 'Control.Arrow.^>>'
(^=>) :: Monad m => (b -> c) -> (c -> m d) -> b -> m d
(^=>) f k = runKleisli $ f ^>> (Kleisli k)
-- | Kleisli postcomposition of a monad with a pure function.
-- Equivalent to 'Control.Arrow.>>^'
(=>^) :: Monad m => (b -> m c) -> (c -> d) -> b -> m d
(=>^) k f = runKleisli $ Kleisli k >>^ f
-- | Kleisli precomposition of a monad with a pure function (right-to-left variant).
-- Equivalent to 'Control.Arrow.<<^'
(<=^) :: Monad m => (c -> m d) -> (b -> c) -> (b -> m d)
(<=^) = flip (^=>)
-- | Kleisli postcomposition of a monad with a pure function (right-to-left variant).
-- Equivalent to 'Control.Arrow.^<<'
(^<=) :: Monad m => (c -> d) -> (b -> m c) -> b -> m d
(^<=) = flip (=>^)