module Data.Singletons.TH.Syntax.LocalVar
( LocalVar(..)
, foldTypeLocalVars
, localVarToTvb
, localVarToType
, localVarToTypeArg
, tvbToLocalVar
) where
import Data.Data (Data)
import Data.Function (on)
import Language.Haskell.TH.Desugar
import Language.Haskell.TH.Syntax
data LocalVar = LocalVar
{ LocalVar -> Name
lvName :: Name
, LocalVar -> Maybe DKind
lvKind :: Maybe DKind
} deriving (Typeable LocalVar
Typeable LocalVar =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LocalVar -> c LocalVar)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LocalVar)
-> (LocalVar -> Constr)
-> (LocalVar -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LocalVar))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LocalVar))
-> ((forall b. Data b => b -> b) -> LocalVar -> LocalVar)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r)
-> (forall u. (forall d. Data d => d -> u) -> LocalVar -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> LocalVar -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar)
-> Data LocalVar
LocalVar -> Constr
LocalVar -> DataType
(forall b. Data b => b -> b) -> LocalVar -> LocalVar
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> LocalVar -> u
forall u. (forall d. Data d => d -> u) -> LocalVar -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LocalVar
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LocalVar -> c LocalVar
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LocalVar)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LocalVar)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LocalVar -> c LocalVar
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LocalVar -> c LocalVar
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LocalVar
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LocalVar
$ctoConstr :: LocalVar -> Constr
toConstr :: LocalVar -> Constr
$cdataTypeOf :: LocalVar -> DataType
dataTypeOf :: LocalVar -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LocalVar)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LocalVar)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LocalVar)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LocalVar)
$cgmapT :: (forall b. Data b => b -> b) -> LocalVar -> LocalVar
gmapT :: (forall b. Data b => b -> b) -> LocalVar -> LocalVar
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LocalVar -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> LocalVar -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> LocalVar -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LocalVar -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LocalVar -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LocalVar -> m LocalVar
Data, Int -> LocalVar -> ShowS
[LocalVar] -> ShowS
LocalVar -> String
(Int -> LocalVar -> ShowS)
-> (LocalVar -> String) -> ([LocalVar] -> ShowS) -> Show LocalVar
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LocalVar -> ShowS
showsPrec :: Int -> LocalVar -> ShowS
$cshow :: LocalVar -> String
show :: LocalVar -> String
$cshowList :: [LocalVar] -> ShowS
showList :: [LocalVar] -> ShowS
Show)
instance Eq LocalVar where
== :: LocalVar -> LocalVar -> Bool
(==) = Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Name -> Name -> Bool)
-> (LocalVar -> Name) -> LocalVar -> LocalVar -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` LocalVar -> Name
lvName
instance Ord LocalVar where
compare :: LocalVar -> LocalVar -> Ordering
compare = Name -> Name -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Name -> Name -> Ordering)
-> (LocalVar -> Name) -> LocalVar -> LocalVar -> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` LocalVar -> Name
lvName
foldTypeLocalVars :: DType -> [LocalVar] -> DType
foldTypeLocalVars :: DKind -> [LocalVar] -> DKind
foldTypeLocalVars DKind
ty = DKind -> [DTypeArg] -> DKind
applyDType DKind
ty ([DTypeArg] -> DKind)
-> ([LocalVar] -> [DTypeArg]) -> [LocalVar] -> DKind
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LocalVar -> DTypeArg) -> [LocalVar] -> [DTypeArg]
forall a b. (a -> b) -> [a] -> [b]
map LocalVar -> DTypeArg
localVarToTypeArg
localVarToTvb :: flag -> LocalVar -> DTyVarBndr flag
localVarToTvb :: forall flag. flag -> LocalVar -> DTyVarBndr flag
localVarToTvb flag
flag (LocalVar { lvName :: LocalVar -> Name
lvName = Name
nm, lvKind :: LocalVar -> Maybe DKind
lvKind = Maybe DKind
mbKind }) =
case Maybe DKind
mbKind of
Maybe DKind
Nothing -> Name -> flag -> DTyVarBndr flag
forall flag. Name -> flag -> DTyVarBndr flag
DPlainTV Name
nm flag
flag
Just DKind
kind -> Name -> flag -> DKind -> DTyVarBndr flag
forall flag. Name -> flag -> DKind -> DTyVarBndr flag
DKindedTV Name
nm flag
flag DKind
kind
localVarToType :: LocalVar -> DType
localVarToType :: LocalVar -> DKind
localVarToType (LocalVar { lvName :: LocalVar -> Name
lvName = Name
local_nm }) = Name -> DKind
DVarT Name
local_nm
localVarToTypeArg :: LocalVar -> DTypeArg
localVarToTypeArg :: LocalVar -> DTypeArg
localVarToTypeArg = DKind -> DTypeArg
DTANormal (DKind -> DTypeArg) -> (LocalVar -> DKind) -> LocalVar -> DTypeArg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LocalVar -> DKind
localVarToType
tvbToLocalVar :: DTyVarBndr flag -> LocalVar
tvbToLocalVar :: forall flag. DTyVarBndr flag -> LocalVar
tvbToLocalVar (DPlainTV Name
nm flag
_) =
LocalVar { lvName :: Name
lvName = Name
nm, lvKind :: Maybe DKind
lvKind = Maybe DKind
forall a. Maybe a
Nothing }
tvbToLocalVar (DKindedTV Name
nm flag
_ DKind
kind) =
LocalVar { lvName :: Name
lvName = Name
nm, lvKind :: Maybe DKind
lvKind = DKind -> Maybe DKind
forall a. a -> Maybe a
Just DKind
kind }