packages feed

composition-prelude-0.1.0.0: src/Control/Composition.hs

module Control.Composition
    ( -- ^ Postcomposition
      (.*)
    , (.**)
    -- ^ Precomposition
    , (-.)
    , (-.*)
    -- ^ Tuple helpers
    , both
    -- ^ Reexports from Control.Arrow
    , (&&&)
    , (***)
    -- ^ Reexports from Control.Monad
    , join
    , (=<<)
    , (>=>)
    , (<=<)
    -- ^ Reexports from base
    , (&)
    , fix
    , on
    ) where

import           Control.Arrow ((&&&), (***))
import           Control.Monad (join, (<=<), (=<<), (>=>))
import           Data.Function (fix, on, (&))

infixr 8 .*
infixr 8 -.*

{-weird' :: (b -> (c -> d)) -> (a -> (c -> b)) -> (a -> (c -> d))
weird' = (<=<)

weird :: (a -> (b -> c)) -> (b -> a) -> (b -> c)
weird = (=<<)-}

both :: (a -> b) -> (a, a) -> (b, b)
both = join (***)

-- | As an example:
--
-- > λ:> ((*2) .* (+)) 1 3 4
-- > 4
(.*) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(.*) f g x y = f (g x y)

(.**) :: (d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e
(.**) f g x y z = f (g x y z)

-- | The Oedipus combinator
(-.*) :: (b -> c) -> (a -> c -> d) -> a -> b -> d
(-.*) f g x y = g x (f y)

-- | Backwards function composition
(-.) :: (a -> b) -> (b -> c) -> a -> c
(-.) f g x = g (f x)