-- | 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 { Const κ a b z -> κ a b
getConst :: κ a b }
  deriving (Const κ a b z -> Const κ a b z -> Bool
(Const κ a b z -> Const κ a b z -> Bool)
-> (Const κ a b z -> Const κ a b z -> Bool) -> Eq (Const κ a b z)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Eq (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
/= :: Const κ a b z -> Const κ a b z -> Bool
$c/= :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Eq (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
== :: Const κ a b z -> Const κ a b z -> Bool
$c== :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Eq (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
Eq, Eq (Const κ a b z)
Eq (Const κ a b z) =>
(Const κ a b z -> Const κ a b z -> Ordering)
-> (Const κ a b z -> Const κ a b z -> Bool)
-> (Const κ a b z -> Const κ a b z -> Bool)
-> (Const κ a b z -> Const κ a b z -> Bool)
-> (Const κ a b z -> Const κ a b z -> Bool)
-> (Const κ a b z -> Const κ a b z -> Const κ a b z)
-> (Const κ a b z -> Const κ a b z -> Const κ a b z)
-> Ord (Const κ a b z)
Const κ a b z -> Const κ a b z -> Bool
Const κ a b z -> Const κ a b z -> Ordering
Const κ a b z -> Const κ a b z -> Const κ a b z
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Eq (Const κ a b z)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Ordering
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Const κ a b z
min :: Const κ a b z -> Const κ a b z -> Const κ a b z
$cmin :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Const κ a b z
max :: Const κ a b z -> Const κ a b z -> Const κ a b z
$cmax :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Const κ a b z
>= :: Const κ a b z -> Const κ a b z -> Bool
$c>= :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
> :: Const κ a b z -> Const κ a b z -> Bool
$c> :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
<= :: Const κ a b z -> Const κ a b z -> Bool
$c<= :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
< :: Const κ a b z -> Const κ a b z -> Bool
$c< :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Bool
compare :: Const κ a b z -> Const κ a b z -> Ordering
$ccompare :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Const κ a b z -> Const κ a b z -> Ordering
$cp1Ord :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Ord (κ a b) =>
Eq (Const κ a b z)
Ord, Int -> Const κ a b z -> ShowS
[Const κ a b z] -> ShowS
Const κ a b z -> String
(Int -> Const κ a b z -> ShowS)
-> (Const κ a b z -> String)
-> ([Const κ a b z] -> ShowS)
-> Show (Const κ a b z)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Show (κ a b) =>
Int -> Const κ a b z -> ShowS
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Show (κ a b) =>
[Const κ a b z] -> ShowS
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Show (κ a b) =>
Const κ a b z -> String
showList :: [Const κ a b z] -> ShowS
$cshowList :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Show (κ a b) =>
[Const κ a b z] -> ShowS
show :: Const κ a b z -> String
$cshow :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Show (κ a b) =>
Const κ a b z -> String
showsPrec :: Int -> Const κ a b z -> ShowS
$cshowsPrec :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) k (z :: k).
Show (κ a b) =>
Int -> Const κ a b z -> ShowS
Show, (a -> m) -> Const κ a b a -> m
(forall m. Monoid m => Const κ a b m -> m)
-> (forall m a. Monoid m => (a -> m) -> Const κ a b a -> m)
-> (forall m a. Monoid m => (a -> m) -> Const κ a b a -> m)
-> (forall a b. (a -> b -> b) -> b -> Const κ a b a -> b)
-> (forall a b. (a -> b -> b) -> b -> Const κ a b a -> b)
-> (forall b a. (b -> a -> b) -> b -> Const κ a b a -> b)
-> (forall b a. (b -> a -> b) -> b -> Const κ a b a -> b)
-> (forall a. (a -> a -> a) -> Const κ a b a -> a)
-> (forall a. (a -> a -> a) -> Const κ a b a -> a)
-> (forall a. Const κ a b a -> [a])
-> (forall a. Const κ a b a -> Bool)
-> (forall a. Const κ a b a -> Int)
-> (forall a. Eq a => a -> Const κ a b a -> Bool)
-> (forall a. Ord a => Const κ a b a -> a)
-> (forall a. Ord a => Const κ a b a -> a)
-> (forall a. Num a => Const κ a b a -> a)
-> (forall a. Num a => Const κ a b a -> a)
-> Foldable (Const κ a b)
forall a. Eq a => a -> Const κ a b a -> Bool
forall a. Num a => Const κ a b a -> a
forall a. Ord a => Const κ a b a -> a
forall m. Monoid m => Const κ a b m -> m
forall a. Const κ a b a -> Bool
forall a. Const κ a b a -> Int
forall a. Const κ a b a -> [a]
forall a. (a -> a -> a) -> Const κ a b a -> a
forall m a. Monoid m => (a -> m) -> Const κ a b a -> m
forall b a. (b -> a -> b) -> b -> Const κ a b a -> b
forall a b. (a -> b -> b) -> b -> Const κ a b a -> b
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Eq a =>
a -> Const κ a b a -> Bool
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Num a =>
Const κ a b a -> a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Ord a =>
Const κ a b a -> a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) m.
Monoid m =>
Const κ a b m -> m
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Const κ a b a -> Bool
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Const κ a b a -> Int
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Const κ a b a -> [a]
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
(a -> a -> a) -> Const κ a b a -> a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) m a.
Monoid m =>
(a -> m) -> Const κ a b a -> m
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) b a.
(b -> a -> b) -> b -> Const κ a b a -> b
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
(a -> b -> b) -> b -> Const κ a b a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: Const κ a b a -> a
$cproduct :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Num a =>
Const κ a b a -> a
sum :: Const κ a b a -> a
$csum :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Num a =>
Const κ a b a -> a
minimum :: Const κ a b a -> a
$cminimum :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Ord a =>
Const κ a b a -> a
maximum :: Const κ a b a -> a
$cmaximum :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Ord a =>
Const κ a b a -> a
elem :: a -> Const κ a b a -> Bool
$celem :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Eq a =>
a -> Const κ a b a -> Bool
length :: Const κ a b a -> Int
$clength :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Const κ a b a -> Int
null :: Const κ a b a -> Bool
$cnull :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Const κ a b a -> Bool
toList :: Const κ a b a -> [a]
$ctoList :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
Const κ a b a -> [a]
foldl1 :: (a -> a -> a) -> Const κ a b a -> a
$cfoldl1 :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
(a -> a -> a) -> Const κ a b a -> a
foldr1 :: (a -> a -> a) -> Const κ a b a -> a
$cfoldr1 :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a.
(a -> a -> a) -> Const κ a b a -> a
foldl' :: (b -> a -> b) -> b -> Const κ a b a -> b
$cfoldl' :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) b a.
(b -> a -> b) -> b -> Const κ a b a -> b
foldl :: (b -> a -> b) -> b -> Const κ a b a -> b
$cfoldl :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) b a.
(b -> a -> b) -> b -> Const κ a b a -> b
foldr' :: (a -> b -> b) -> b -> Const κ a b a -> b
$cfoldr' :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
(a -> b -> b) -> b -> Const κ a b a -> b
foldr :: (a -> b -> b) -> b -> Const κ a b a -> b
$cfoldr :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
(a -> b -> b) -> b -> Const κ a b a -> b
foldMap' :: (a -> m) -> Const κ a b a -> m
$cfoldMap' :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) m a.
Monoid m =>
(a -> m) -> Const κ a b a -> m
foldMap :: (a -> m) -> Const κ a b a -> m
$cfoldMap :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) m a.
Monoid m =>
(a -> m) -> Const κ a b a -> m
fold :: Const κ a b m -> m
$cfold :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) m.
Monoid m =>
Const κ a b m -> m
Foldable, (a -> b) -> Const κ a b a -> Const κ a b b
(forall a b. (a -> b) -> Const κ a b a -> Const κ a b b)
-> (forall a b. a -> Const κ a b b -> Const κ a b a)
-> Functor (Const κ a b)
forall a b. a -> Const κ a b b -> Const κ a b a
forall a b. (a -> b) -> Const κ a b a -> Const κ a b b
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
a -> Const κ a b b -> Const κ a b a
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
(a -> b) -> Const κ a b a -> Const κ a b b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Const κ a b b -> Const κ a b a
$c<$ :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
a -> Const κ a b b -> Const κ a b a
fmap :: (a -> b) -> Const κ a b a -> Const κ a b b
$cfmap :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) a b.
(a -> b) -> Const κ a b a -> Const κ a b b
Functor, Functor (Const κ a b)
Foldable (Const κ a b)
(Functor (Const κ a b), Foldable (Const κ a b)) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> Const κ a b a -> f (Const κ a b b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    Const κ a b (f a) -> f (Const κ a b a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> Const κ a b a -> m (Const κ a b b))
-> (forall (m :: * -> *) a.
    Monad m =>
    Const κ a b (m a) -> m (Const κ a b a))
-> Traversable (Const κ a b)
(a -> f b) -> Const κ a b a -> f (Const κ a b b)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k).
Functor (Const κ a b)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k).
Foldable (Const κ a b)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (m :: * -> *) a.
Monad m =>
Const κ a b (m a) -> m (Const κ a b a)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (f :: * -> *) a.
Applicative f =>
Const κ a b (f a) -> f (Const κ a b a)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Const κ a b a -> m (Const κ a b b)
forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Const κ a b a -> f (Const κ a b b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
Const κ a b (m a) -> m (Const κ a b a)
forall (f :: * -> *) a.
Applicative f =>
Const κ a b (f a) -> f (Const κ a b a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Const κ a b a -> m (Const κ a b b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Const κ a b a -> f (Const κ a b b)
sequence :: Const κ a b (m a) -> m (Const κ a b a)
$csequence :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (m :: * -> *) a.
Monad m =>
Const κ a b (m a) -> m (Const κ a b a)
mapM :: (a -> m b) -> Const κ a b a -> m (Const κ a b b)
$cmapM :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Const κ a b a -> m (Const κ a b b)
sequenceA :: Const κ a b (f a) -> f (Const κ a b a)
$csequenceA :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (f :: * -> *) a.
Applicative f =>
Const κ a b (f a) -> f (Const κ a b a)
traverse :: (a -> f b) -> Const κ a b a -> f (Const κ a b b)
$ctraverse :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k) (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Const κ a b a -> f (Const κ a b b)
$cp2Traversable :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k).
Foldable (Const κ a b)
$cp1Traversable :: forall k k (κ :: k -> k -> *) (a :: k) (b :: k).
Functor (Const κ a b)
Traversable)

instance Semigroupoid κ => Apply (Const κ) where
    Const f :: κ i j
f <*> :: Const κ i j (a -> b) -> Const κ j k a -> Const κ i k b
<*> Const g :: κ j k
g = κ i k -> Const κ i k b
forall k k k (κ :: k -> k -> *) (a :: k) (b :: k) (z :: k).
κ a b -> Const κ a b z
Const (κ j k
g κ j k -> κ i j -> κ i k
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. κ i j
f)

instance Category κ => Base.Applicative (Const κ a a) where
    pure :: a -> Const κ a a a
pure = Const κ a a a -> a -> Const κ a a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (κ a a -> Const κ a a a
forall k k k (κ :: k -> k -> *) (a :: k) (b :: k) (z :: k).
κ a b -> Const κ a b z
Const κ a a
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id)
    <*> :: Const κ a a (a -> b) -> Const κ a a a -> Const κ a a b
(<*>) = Const κ a a (a -> b) -> Const κ a a a -> Const κ a a b
forall k (p :: k -> k -> * -> *) (i :: k) (j :: k) a b (k :: k).
Apply p =>
p i j (a -> b) -> p j k a -> p i k b
(<*>)