module Parameterized.Control.Applicative
( PPointed(..)
, PApplicative(..)
, (&<*>)
, (&*>)
, (&<*)
, pliftA
, pliftA2
, pliftA3
, PEmpty(..)
, PAlternative(..)
, (&<|>)
) where
import Data.Kind
class PPointed (m :: k -> Type -> Type) (id :: k) where
ppure :: a -> m id a
class (Functor (m t), Functor (m u), Functor (m v)) =>
PApplicative (m :: k -> Type -> Type) (t :: k) (u :: k) (v :: k) | t u -> v where
papply :: m t (a -> b) -> m u a -> m v b
(&<*>) :: (PApplicative m t u v) => m t (a -> b) -> m u a -> m v b
(&<*>) = papply
infixl 4 &<*>
(&*>) :: (PApplicative m t u v) => m t a -> m u b -> m v b
a1 &*> a2 = (id <$ a1) &<*> a2
infixl 4 &<*
(&<*) :: (PApplicative m t u v) => m t a -> m u b -> m v a
(&<*) = pliftA2 const
infixl 4 &*>
pliftA :: (Functor (m t)) => (a -> b) -> m t a -> m t b
pliftA f x = f <$> x
pliftA2 :: (PApplicative m t u v) => (a -> b -> c) -> m t a -> m u b -> m v c
pliftA2 f x y = (f <$> x) `papply` y
pliftA3
:: ( PApplicative m t u v
, PApplicative m v w x
)
=> (a -> b -> c -> d) -> m t a -> m u b -> m w c -> m x d
pliftA3 f a b c = pliftA2 f a b &<*> c
class PEmpty (m :: k -> Type -> Type) (id :: k) | m -> id where
pempty :: m id a
class PAlternative (m :: k -> Type -> Type) (t :: k) (u :: k) (v :: k) | t u -> v where
pappend :: m t a -> m u a -> m v a
(&<|>) :: (PAlternative m t u v) => m t a -> m u a -> m v a
(&<|>) = pappend
infixl 3 &<|>