Permalink
Fetching contributors…
Cannot retrieve contributors at this time
48 lines (40 sloc) 1.71 KB
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE UndecidableInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Monoid.Endomorphism
-- Copyright : (c) 2013-2015 diagrams-core team (see LICENSE)
-- License : BSD-style (see LICENSE)
-- Maintainer : diagrams-discuss@googlegroups.com
--
-- The monoid of endomorphisms over any 'Category'.
--
-----------------------------------------------------------------------------
module Data.Monoid.Endomorphism
( Endomorphism(..)
)
where
import Control.Category
import Data.Group
import Data.Groupoid
import Data.Monoid (Monoid(..))
import Data.Semigroup (Semigroup(..))
import Data.Semigroupoid
import Prelude (Show)
-- | An 'Endomorphism' in a given 'Category' is a morphism from some
-- object to itself. The set of endomorphisms for a particular
-- object form a monoid, with composition as the combining operation
-- and the identity morphism as the identity element.
newtype Endomorphism k a = Endomorphism {getEndomorphism :: k a a}
deriving instance Show (k a a) => Show (Endomorphism k a)
instance Semigroupoid k => Semigroup (Endomorphism k a) where
Endomorphism a <> Endomorphism b = Endomorphism (a `o` b)
instance (Semigroupoid k, Category k) => Monoid (Endomorphism k a) where
mempty = Endomorphism id
#if !MIN_VERSION_base(4,11,0)
Endomorphism a `mappend` Endomorphism b = Endomorphism (a . b)
#endif
instance (Category k, Groupoid k) => Group (Endomorphism k a) where
invert (Endomorphism a) = Endomorphism (inv a)