-- | The indexed constant functor: a @'Const' κ@ ignores its final argument and merely holds a morphism of @κ@, which are composed as the @'Const'@ terms are 'join'ed and @('<*>')@d.

module Data.Functor.Indexed.Const (Const (..)) where

import Prelude hiding (Applicative (..), (.), id)
import qualified Control.Applicative as Base
import Control.Category (Category (id))
import Control.Semigroupoid
import Data.Functor.Indexed

newtype Const κ a b z = Const { getConst :: κ a b }
  deriving (Eq, Ord, Show, Foldable, Functor, Traversable)

instance Semigroupoid κ => Apply (Const κ) where
    Const f <*> Const g = Const (g . f)

instance Category κ => Base.Applicative (Const κ a a) where
    pure = pure (Const id)
    (<*>) = (<*>)