{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Data.Singletons.Prelude.Applicative (
PApplicative(..), SApplicative(..),
PAlternative(..), SAlternative(..),
Sing, SConst(..), Const, GetConst,
type (<$>), (%<$>), type (<$), (%<$), type (<**>), (%<**>),
LiftA, sLiftA, LiftA3, sLiftA3, Optional, sOptional,
PureSym0, PureSym1,
type (<*>@#@$), type (<*>@#@$$), type (<*>@#@$$$),
type (*>@#@$), type (*>@#@$$), type (*>@#@$$$),
type (<*@#@$), type (<*@#@$$), type (<*@#@$$$),
EmptySym0, type (<|>@#@$), type (<|>@#@$$), type (<|>@#@$$$),
ConstSym0, ConstSym1, GetConstSym0, GetConstSym1,
type (<$>@#@$), type (<$>@#@$$), type (<$>@#@$$$),
type (<$@#@$), type (<$@#@$$), type (<$@#@$$$),
type (<**>@#@$), type (<**>@#@$$), type (<**>@#@$$$),
LiftASym0, LiftASym1, LiftASym2,
LiftA2Sym0, LiftA2Sym1, LiftA2Sym2, LiftA2Sym3,
LiftA3Sym0, LiftA3Sym1, LiftA3Sym2, LiftA3Sym3,
OptionalSym0, OptionalSym1
) where
import Control.Applicative
import Data.Ord (Down(..))
import Data.Singletons.Prelude.Const
import Data.Singletons.Prelude.Functor
import Data.Singletons.Prelude.Instances
import Data.Singletons.Prelude.Monad.Internal
import Data.Singletons.Prelude.Monoid
import Data.Singletons.Prelude.Ord
import Data.Singletons.Single
$(singletonsOnly [d|
optional :: Alternative f => f a -> f (Maybe a)
optional v = Just <$> v <|> pure Nothing
instance Monoid a => Applicative ((,) a) where
pure x = (mempty, x)
(u, f) <*> (v, x) = (u `mappend` v, f x)
liftA2 f (u, x) (v, y) = (u `mappend` v, f x y)
instance Applicative Down where
pure = Down
Down f <*> Down x = Down (f x)
|])