module Control.Bifunctor.Constant
( module Control.Functor.Exponential
, module Control.Functor.Contravariant
, module Control.Bifunctor.Associative
, ConstB(..)
, FstB(..)
, SndB(..)
) where
import Control.Bifunctor.Associative
import Control.Functor.Exponential
import Control.Functor.Contravariant
newtype ConstB t a b = ConstB { runConstB :: t }
instance Bifunctor (ConstB t) where
bimap _ _ = ConstB . runConstB
instance Functor (ConstB t a) where
fmap _ = ConstB . runConstB
instance ContravariantFunctor (ConstB t a) where
contramap _ = ConstB . runConstB
instance ExpFunctor (ConstB t a) where
xmap _ _ = ConstB . runConstB
newtype FstB a b = FstB { runFstB :: a }
instance Bifunctor FstB where
bimap f _ = FstB . f . runFstB
instance Associative FstB where
associate = FstB . runFstB . runFstB
instance Functor (FstB a) where
fmap _ (FstB a) = FstB a
instance ContravariantFunctor (FstB a) where
contramap _ (FstB a) = FstB a
instance ExpFunctor (FstB a) where
xmap _ _ (FstB a) = FstB a
newtype SndB a b = SndB { runSndB :: b }
instance Bifunctor SndB where
bimap _ g = SndB . g . runSndB
instance Functor (SndB a) where
fmap = bimap id