{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, GeneralizedNewtypeDeriving, DeriveDataTypeable, PatternGuards #-}
module Numeric.Coalgebra.Categorical 
  ( Morphism(..)
  ) where

import Data.Data
import Numeric.Partial.Semigroup
import Numeric.Partial.Monoid
import Numeric.Partial.Group
import Numeric.Algebra.Class
import Numeric.Algebra.Unital
import Numeric.Algebra.Commutative

-- the dual categorical algebra
newtype Morphism a = Morphism a deriving (Eq,Ord,Show,Read,PartialSemigroup,PartialMonoid,PartialGroup,Data,Typeable)

instance (Commutative r, Monoidal r, Semiring r, PartialSemigroup a) => Coalgebra r (Morphism a) where
  comult f a b 
    | Just c <- padd a b = f c
    | otherwise = zero

instance (Commutative r, Monoidal r, Semiring r, PartialMonoid a) => CounitalCoalgebra r (Morphism a) where
  counit f = f pzero