packages feed

lhc-0.6.20090126: lib/base/src/Control/Category.hs

{-# LHC_OPTIONS -fcpp -N #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Control.Category
-- Copyright   :  (c) Ashley Yakeley 2007
-- License     :  BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer  :  ashley@semantic.org
-- Stability   :  experimental
-- Portability :  portable

-- http://hackage.haskell.org/trac/ghc/ticket/1773

module Control.Category where

import Lhc.Basics hiding (id,(.))
import qualified Lhc.Basics as Prelude

infixr 9 .
infixr 1 >>>, <<<

-- | A class for categories.
--   id and (.) must form a monoid.
class Category cat where
        -- | the identity morphism
        id :: cat a a

        -- | morphism composition
        (.) :: cat b c -> cat a b -> cat a c

{-# RULES
 "identity/left" forall p .
                 id . p = p
 "identity/right"        forall p .
                 p . id = p
 "association"   forall p q r .
                 (p . q) . r = p . (q . r)
  #-}

instance Category (->) where
        id = Prelude.id
#ifndef __HADDOCK__
-- Haddock 1.x cannot parse this:
        (.) = (Prelude..)
#endif

-- | Right-to-left composition
(<<<) :: Category cat => cat b c -> cat a b -> cat a c
(<<<) = (.)

-- | Left-to-right composition
(>>>) :: Category cat => cat a b -> cat b c -> cat a c
f >>> g = g . f