module Data.Functor.Constant where

import Control.Functor.Covariant (Covariant ((<$>)))
import Control.Functor.Covariant.Pointable (Pointable (point))
import Control.Functor.Covariant.Composition.Traversable (Traversable ((->>)))
import Control.Functor.Contravariant (Contravariant ((>$<)))
import Control.Functor.Polyvariant.Bicovariant (Bicovariant (bicomap))

newtype Constant a b = Constant a

instance Covariant (Constant a) where
        _ <$> Constant x = Constant x

instance Contravariant (Constant a) where
        _ >$< Constant x = Constant x

instance Traversable (Constant a) where
        Constant x ->> _ = point (Constant x)

instance Bicovariant Constant where
        bicomap f _ (Constant x) = Constant (f x)