{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall -Wno-name-shadowing #-}
module Data.IFunctor.IIdentity
( IIdentity (IIdentity, runIIdentity)
) where
import Data.Data (Data)
import Data.Function (on)
import Data.IComonad (IComonad (..))
import Data.IFunctor (IFunctor (..))
import Data.IFunctor.Classes
import Data.IMonad (IMonad (..))
import Data.ITraversable (ITraversable (..))
import Data.Typeable (Typeable)
import GHC.Generics (Generic, Generic1)
import Singlethongs (SingI)
import Text.Read
data IIdentity f ix = IIdentity
{ runIIdentity :: f ix
}
deriving (Typeable, Data, Generic, Generic1)
instance IFunctor IIdentity where
imap f = IIdentity . f . runIIdentity
instance IMonad IIdentity where
ipure = IIdentity
ijoin = runIIdentity
instance IComonad IIdentity where
iextract = runIIdentity
iduplicate = IIdentity
instance ITraversable IIdentity where
itraverse f = fmap IIdentity . f . runIIdentity
instance IShow IIdentity where
ishowsPrec sp p (IIdentity x) = showParen (p > 10) $
showString "IIdentity " . sp p x
instance IRead IIdentity where
ireadPrec rp = parens $ prec 10 $ do
Ident "IIdentity" <- lexP
x <- step rp
pure $ IIdentity x
instance IEq IIdentity where
ieq eq = eq `on` runIIdentity
instance IOrd IIdentity where
icompare comp = comp `on` runIIdentity
instance (IShow2 f, SingI ix) => Show (IIdentity f ix) where
showsPrec = ishowsPrec1
instance (IRead2 f, SingI ix) => Read (IIdentity f ix) where
readPrec = ireadPrec1
instance (IEq2 f, SingI ix) => Eq (IIdentity f ix) where
(==) = ieq1
instance (IOrd2 f, SingI ix) => Ord (IIdentity f ix) where
compare = icompare1