module Data.Singletons.TH.Single.Data
( singDataD
, singCtor
) where
import Language.Haskell.TH.Desugar as Desugar
import Language.Haskell.TH.Syntax
import qualified Data.Map.Strict as Map
import Data.Map.Strict (Map)
import Data.Maybe
import Data.Traversable (mapAccumL)
import Data.Singletons.TH.Names
import Data.Singletons.TH.Options
import Data.Singletons.TH.Promote.Type
import Data.Singletons.TH.Single.Defun
import Data.Singletons.TH.Single.Fixity
import Data.Singletons.TH.Single.Monad
import Data.Singletons.TH.Syntax
import Data.Singletons.TH.Util
import Control.Monad
singDataD :: DataDecl -> SgM [DDec]
singDataD :: DataDecl -> SgM [DDec]
singDataD (DataDecl DataFlavor
df Name
name [DTyVarBndrVis]
tvbs [DCon]
ctors) = do
Options
opts <- SgM Options
forall (m :: * -> *). OptionsMonad m => m Options
getOptions
let reqTvbNames :: [Name]
reqTvbNames = (DTyVarBndrVis -> Name) -> [DTyVarBndrVis] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map DTyVarBndrVis -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName ([DTyVarBndrVis] -> [Name]) -> [DTyVarBndrVis] -> [Name]
forall a b. (a -> b) -> a -> b
$
(DTyVarBndrVis -> Bool) -> [DTyVarBndrVis] -> [DTyVarBndrVis]
forall a. (a -> Bool) -> [a] -> [a]
filter (\DTyVarBndrVis
tvb -> DTyVarBndrVis -> BndrVis
forall flag. DTyVarBndr flag -> flag
extractTvbFlag DTyVarBndrVis
tvb BndrVis -> BndrVis -> Bool
forall a. Eq a => a -> a -> Bool
== BndrVis
BndrReq) [DTyVarBndrVis]
tvbs
ctor_names :: [Name]
ctor_names = (DCon -> Name) -> [DCon] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map DCon -> Name
extractName [DCon]
ctors
rec_sel_names :: [Name]
rec_sel_names = (DCon -> [Name]) -> [DCon] -> [Name]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap DCon -> [Name]
extractRecSelNames [DCon]
ctors
DKind
k <- DKind -> SgM DKind
forall (m :: * -> *). OptionsMonad m => DKind -> m DKind
promoteType (DKind -> [DTyVarBndrVis] -> DKind
foldTypeTvbs (Name -> DKind
DConT Name
name) [DTyVarBndrVis]
tvbs)
Maybe DKind
mb_data_sak <- Name -> SgM (Maybe DKind)
forall (q :: * -> *). DsMonad q => Name -> q (Maybe DKind)
dsReifyType Name
name
[DCon]
ctors' <- (DCon -> SgM DCon) -> [DCon] -> SgM [DCon]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Name -> DCon -> SgM DCon
singCtor Name
name) [DCon]
ctors
[DDec]
fixityDecs <- [Name] -> SgM [DDec]
forall (q :: * -> *). OptionsMonad q => [Name] -> q [DDec]
singReifiedInfixDecls ([Name] -> SgM [DDec]) -> [Name] -> SgM [DDec]
forall a b. (a -> b) -> a -> b
$ [Name]
ctor_names [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
rec_sel_names
[DClause]
fromSingClauses <- (DCon -> SgM DClause) -> [DCon] -> SgM [DClause]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM DCon -> SgM DClause
mkFromSingClause [DCon]
ctors
DClause
emptyFromSingClause <- SgM DClause
mkEmptyFromSingClause
[DClause]
toSingClauses <- (DCon -> SgM DClause) -> [DCon] -> SgM [DClause]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM DCon -> SgM DClause
mkToSingClause [DCon]
ctors
DClause
emptyToSingClause <- SgM DClause
mkEmptyToSingClause
let singKindInst :: DDec
singKindInst =
Maybe Overlap
-> Maybe [DTyVarBndrUnit] -> DCxt -> DKind -> [DDec] -> DDec
DInstanceD Maybe Overlap
forall a. Maybe a
Nothing Maybe [DTyVarBndrUnit]
forall a. Maybe a
Nothing
((Name -> DKind) -> [Name] -> DCxt
forall a b. (a -> b) -> [a] -> [b]
map (DKind -> DKind
singKindConstraint (DKind -> DKind) -> (Name -> DKind) -> Name -> DKind
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> DKind
DVarT) [Name]
reqTvbNames)
(DKind -> DKind -> DKind
DAppT (Name -> DKind
DConT Name
singKindClassName) DKind
k)
[ DTySynEqn -> DDec
DTySynInstD (DTySynEqn -> DDec) -> DTySynEqn -> DDec
forall a b. (a -> b) -> a -> b
$ Maybe [DTyVarBndrUnit] -> DKind -> DKind -> DTySynEqn
DTySynEqn Maybe [DTyVarBndrUnit]
forall a. Maybe a
Nothing
(Name -> DKind
DConT Name
demoteName DKind -> DKind -> DKind
`DAppT` DKind
k)
(DKind -> DCxt -> DKind
foldType (Name -> DKind
DConT Name
name)
((Name -> DKind) -> [Name] -> DCxt
forall a b. (a -> b) -> [a] -> [b]
map (DKind -> DKind -> DKind
DAppT DKind
demote (DKind -> DKind) -> (Name -> DKind) -> Name -> DKind
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> DKind
DVarT) [Name]
reqTvbNames))
, DLetDec -> DDec
DLetDec (DLetDec -> DDec) -> DLetDec -> DDec
forall a b. (a -> b) -> a -> b
$ Name -> [DClause] -> DLetDec
DFunD Name
fromSingName
([DClause]
fromSingClauses [DClause] -> [DClause] -> [DClause]
forall a. [a] -> [a] -> [a]
`orIfEmpty` [DClause
emptyFromSingClause])
, DLetDec -> DDec
DLetDec (DLetDec -> DDec) -> DLetDec -> DDec
forall a b. (a -> b) -> a -> b
$ Name -> [DClause] -> DLetDec
DFunD Name
toSingName
([DClause]
toSingClauses [DClause] -> [DClause] -> [DClause]
forall a. [a] -> [a] -> [a]
`orIfEmpty` [DClause
emptyToSingClause]) ]
let singDataName :: Name
singDataName = Options -> Name -> Name
singledDataTypeName Options
opts Name
name
singSynInst :: DDec
singSynInst =
DTySynEqn -> DDec
DTySynInstD (DTySynEqn -> DDec) -> DTySynEqn -> DDec
forall a b. (a -> b) -> a -> b
$ Maybe [DTyVarBndrUnit] -> DKind -> DKind -> DTySynEqn
DTySynEqn Maybe [DTyVarBndrUnit]
forall a. Maybe a
Nothing
(Name -> DKind
DConT Name
singFamilyName DKind -> DKind -> DKind
`DAppKindT` DKind
k)
(Name -> DKind
DConT Name
singDataName)
mk_data_dec :: DKind -> DDec
mk_data_dec DKind
kind =
DataFlavor
-> DCxt
-> Name
-> [DTyVarBndrVis]
-> Maybe DKind
-> [DCon]
-> [DDerivClause]
-> DDec
DDataD DataFlavor
Data [] Name
singDataName [] (DKind -> Maybe DKind
forall a. a -> Maybe a
Just DKind
kind) [DCon]
ctors' []
[DDec]
data_decs <- case Maybe DKind
mb_data_sak of
Maybe DKind
Nothing -> do
let sing_tvbs :: [DTyVarBndr Specificity]
sing_tvbs = Specificity -> [DTyVarBndrUnit] -> [DTyVarBndr Specificity]
forall newFlag oldFlag.
newFlag -> [DTyVarBndr oldFlag] -> [DTyVarBndr newFlag]
changeDTVFlags Specificity
SpecifiedSpec ([DTyVarBndrUnit] -> [DTyVarBndr Specificity])
-> [DTyVarBndrUnit] -> [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$
DCxt -> [DTyVarBndrUnit]
toposortTyVarsOf (DCxt -> [DTyVarBndrUnit]) -> DCxt -> [DTyVarBndrUnit]
forall a b. (a -> b) -> a -> b
$ (DTyVarBndrVis -> DKind) -> [DTyVarBndrVis] -> DCxt
forall a b. (a -> b) -> [a] -> [b]
map DTyVarBndrVis -> DKind
forall flag. DTyVarBndr flag -> DKind
dTyVarBndrToDType [DTyVarBndrVis]
tvbs
kinded_sing_ty :: DKind
kinded_sing_ty = DForallTelescope -> DKind -> DKind
DForallT ([DTyVarBndr Specificity] -> DForallTelescope
DForallInvis [DTyVarBndr Specificity]
sing_tvbs) (DKind -> DKind) -> DKind -> DKind
forall a b. (a -> b) -> a -> b
$
DKind
DArrowT DKind -> DKind -> DKind
`DAppT` DKind
k DKind -> DKind -> DKind
`DAppT` Name -> DKind
DConT Name
typeKindName
[DDec] -> SgM [DDec]
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [DKind -> DDec
mk_data_dec DKind
kinded_sing_ty]
Just DKind
data_sak -> do
DKind
sing_data_sak <- DKind -> [DTyVarBndrVis] -> DKind -> SgM DKind
forall (q :: * -> *).
MonadFail q =>
DKind -> [DTyVarBndrVis] -> DKind -> q DKind
singDataSAK DKind
data_sak [DTyVarBndrVis]
tvbs DKind
k
[DDec] -> SgM [DDec]
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [ Name -> DKind -> DDec
DKiSigD Name
singDataName DKind
sing_data_sak
, DKind -> DDec
mk_data_dec DKind
sing_data_sak
]
[DDec] -> SgM [DDec]
forall a. a -> SgM a
forall (m :: * -> *) a. Monad m => a -> m a
return ([DDec] -> SgM [DDec]) -> [DDec] -> SgM [DDec]
forall a b. (a -> b) -> a -> b
$ [DDec]
data_decs [DDec] -> [DDec] -> [DDec]
forall a. [a] -> [a] -> [a]
++
DDec
singSynInst DDec -> [DDec] -> [DDec]
forall a. a -> [a] -> [a]
:
[ DDec
singKindInst | Options -> Bool
genSingKindInsts Options
opts
,
DataFlavor
df DataFlavor -> DataFlavor -> Bool
forall a. Eq a => a -> a -> Bool
/= DataFlavor
Desugar.TypeData
] [DDec] -> [DDec] -> [DDec]
forall a. [a] -> [a] -> [a]
++
[DDec]
fixityDecs
where
mkConName :: Name -> SgM Name
mkConName :: Name -> SgM Name
mkConName
| Name -> String
nameBase Name
name String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== Name -> String
nameBase Name
repName = String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
mkDataName (String -> SgM Name) -> (Name -> String) -> Name -> SgM Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> String
nameBase
| Bool
otherwise = Name -> SgM Name
forall a. a -> SgM a
forall (m :: * -> *) a. Monad m => a -> m a
return
mkFromSingClause :: DCon -> SgM DClause
mkFromSingClause :: DCon -> SgM DClause
mkFromSingClause DCon
c = do
Options
opts <- SgM Options
forall (m :: * -> *). OptionsMonad m => m Options
getOptions
let (Name
cname, Int
numArgs) = DCon -> (Name, Int)
extractNameArgs DCon
c
Name
cname' <- Name -> SgM Name
mkConName Name
cname
[Name]
varNames <- Int -> SgM Name -> SgM [Name]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
numArgs (String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
qNewName String
"b")
DClause -> SgM DClause
forall a. a -> SgM a
forall (m :: * -> *) a. Monad m => a -> m a
return (DClause -> SgM DClause) -> DClause -> SgM DClause
forall a b. (a -> b) -> a -> b
$ [DPat] -> DExp -> DClause
DClause [Name -> DCxt -> [DPat] -> DPat
DConP (Options -> Name -> Name
singledDataConName Options
opts Name
cname) [] ((Name -> DPat) -> [Name] -> [DPat]
forall a b. (a -> b) -> [a] -> [b]
map Name -> DPat
DVarP [Name]
varNames)]
(DExp -> [DExp] -> DExp
foldExp
(Name -> DExp
DConE Name
cname')
((Name -> DExp) -> [Name] -> [DExp]
forall a b. (a -> b) -> [a] -> [b]
map (DExp -> DExp -> DExp
DAppE (Name -> DExp
DVarE Name
fromSingName) (DExp -> DExp) -> (Name -> DExp) -> Name -> DExp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> DExp
DVarE) [Name]
varNames))
mkToSingClause :: DCon -> SgM DClause
mkToSingClause :: DCon -> SgM DClause
mkToSingClause (DCon [DTyVarBndr Specificity]
_tvbs DCxt
_cxt Name
cname DConFields
fields DKind
_rty) = do
Options
opts <- SgM Options
forall (m :: * -> *). OptionsMonad m => m Options
getOptions
let types :: DCxt
types = DConFields -> DCxt
tysOfConFields DConFields
fields
[Name]
varNames <- (DKind -> SgM Name) -> DCxt -> SgM [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (SgM Name -> DKind -> SgM Name
forall a b. a -> b -> a
const (SgM Name -> DKind -> SgM Name) -> SgM Name -> DKind -> SgM Name
forall a b. (a -> b) -> a -> b
$ String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
qNewName String
"b") DCxt
types
[Name]
svarNames <- (DKind -> SgM Name) -> DCxt -> SgM [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (SgM Name -> DKind -> SgM Name
forall a b. a -> b -> a
const (SgM Name -> DKind -> SgM Name) -> SgM Name -> DKind -> SgM Name
forall a b. (a -> b) -> a -> b
$ String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
qNewName String
"c") DCxt
types
DCxt
promoted <- (DKind -> SgM DKind) -> DCxt -> SgM DCxt
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM DKind -> SgM DKind
forall (m :: * -> *). OptionsMonad m => DKind -> m DKind
promoteType DCxt
types
Name
cname' <- Name -> SgM Name
mkConName Name
cname
let varPats :: [DPat]
varPats = (Name -> DKind -> DPat) -> [Name] -> DCxt -> [DPat]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Name -> DKind -> DPat
mkToSingVarPat [Name]
varNames DCxt
promoted
recursiveCalls :: [DExp]
recursiveCalls = (Name -> DKind -> DExp) -> [Name] -> DCxt -> [DExp]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Name -> DKind -> DExp
mkRecursiveCall [Name]
varNames DCxt
promoted
DClause -> SgM DClause
forall a. a -> SgM a
forall (m :: * -> *) a. Monad m => a -> m a
return (DClause -> SgM DClause) -> DClause -> SgM DClause
forall a b. (a -> b) -> a -> b
$
[DPat] -> DExp -> DClause
DClause [Name -> DCxt -> [DPat] -> DPat
DConP Name
cname' [] [DPat]
varPats]
([DExp] -> [DPat] -> DExp -> DExp
multiCase [DExp]
recursiveCalls
((Name -> DPat) -> [Name] -> [DPat]
forall a b. (a -> b) -> [a] -> [b]
map (Name -> DCxt -> [DPat] -> DPat
DConP Name
someSingDataName [] ([DPat] -> DPat) -> (Name -> [DPat]) -> Name -> DPat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DPat -> [DPat]
forall a. a -> [a]
listify (DPat -> [DPat]) -> (Name -> DPat) -> Name -> [DPat]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> DPat
DVarP)
[Name]
svarNames)
(DExp -> DExp -> DExp
DAppE (Name -> DExp
DConE Name
someSingDataName)
(DExp -> [DExp] -> DExp
foldExp (Name -> DExp
DConE (Options -> Name -> Name
singledDataConName Options
opts Name
cname))
((Name -> DExp) -> [Name] -> [DExp]
forall a b. (a -> b) -> [a] -> [b]
map Name -> DExp
DVarE [Name]
svarNames))))
mkToSingVarPat :: Name -> DKind -> DPat
mkToSingVarPat :: Name -> DKind -> DPat
mkToSingVarPat Name
varName DKind
ki =
DPat -> DKind -> DPat
DSigP (Name -> DPat
DVarP Name
varName) (DKind -> DKind -> DKind
DAppT (Name -> DKind
DConT Name
demoteName) DKind
ki)
mkRecursiveCall :: Name -> DKind -> DExp
mkRecursiveCall :: Name -> DKind -> DExp
mkRecursiveCall Name
var_name DKind
ki =
DExp -> DKind -> DExp
DSigE (DExp -> DExp -> DExp
DAppE (Name -> DExp
DVarE Name
toSingName) (Name -> DExp
DVarE Name
var_name))
(DKind -> DKind -> DKind
DAppT (Name -> DKind
DConT Name
someSingTypeName) DKind
ki)
mkEmptyFromSingClause :: SgM DClause
mkEmptyFromSingClause :: SgM DClause
mkEmptyFromSingClause = do
Name
x <- String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
qNewName String
"x"
DClause -> SgM DClause
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DClause -> SgM DClause) -> DClause -> SgM DClause
forall a b. (a -> b) -> a -> b
$ [DPat] -> DExp -> DClause
DClause [Name -> DPat
DVarP Name
x]
(DExp -> DClause) -> DExp -> DClause
forall a b. (a -> b) -> a -> b
$ DExp -> [DMatch] -> DExp
DCaseE (Name -> DExp
DVarE Name
x) []
mkEmptyToSingClause :: SgM DClause
mkEmptyToSingClause :: SgM DClause
mkEmptyToSingClause = do
Name
x <- String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
qNewName String
"x"
DClause -> SgM DClause
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DClause -> SgM DClause) -> DClause -> SgM DClause
forall a b. (a -> b) -> a -> b
$ [DPat] -> DExp -> DClause
DClause [Name -> DPat
DVarP Name
x]
(DExp -> DClause) -> DExp -> DClause
forall a b. (a -> b) -> a -> b
$ Name -> DExp
DConE Name
someSingDataName DExp -> DExp -> DExp
`DAppE` DExp -> [DMatch] -> DExp
DCaseE (Name -> DExp
DVarE Name
x) []
singCtor :: Name -> DCon -> SgM DCon
singCtor :: Name -> DCon -> SgM DCon
singCtor Name
dataName (DCon [DTyVarBndr Specificity]
con_tvbs DCxt
cxt Name
name DConFields
fields DKind
rty)
| Bool -> Bool
not (DCxt -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null DCxt
cxt)
= String -> SgM DCon
forall a. String -> SgM a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Singling of constrained constructors not yet supported"
| Bool
otherwise
= do
Options
opts <- SgM Options
forall (m :: * -> *). OptionsMonad m => m Options
getOptions
let types :: DCxt
types = DConFields -> DCxt
tysOfConFields DConFields
fields
numTypes :: Int
numTypes = DCxt -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length DCxt
types
sName :: Name
sName = Options -> Name -> Name
singledDataConName Options
opts Name
name
sCon :: DExp
sCon = Name -> DExp
DConE Name
sName
pCon :: DKind
pCon = Name -> DKind
DConT (Name -> DKind) -> Name -> DKind
forall a b. (a -> b) -> a -> b
$ Options -> Name -> Name
promotedDataTypeOrConName Options
opts Name
name
DKind -> SgM ()
forall (m :: * -> *). MonadFail m => DKind -> m ()
checkVanillaDType (DKind -> SgM ()) -> DKind -> SgM ()
forall a b. (a -> b) -> a -> b
$ [DTyVarBndr Specificity] -> DCxt -> DCxt -> DKind -> DKind
ravelVanillaDType [DTyVarBndr Specificity]
con_tvbs [] DCxt
types DKind
rty
[Name]
indexNames <- (DKind -> SgM Name) -> DCxt -> SgM [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (SgM Name -> DKind -> SgM Name
forall a b. a -> b -> a
const (SgM Name -> DKind -> SgM Name) -> SgM Name -> DKind -> SgM Name
forall a b. (a -> b) -> a -> b
$ String -> SgM Name
forall (q :: * -> *). Quasi q => String -> q Name
qNewName String
"n") DCxt
types
DCxt
kinds <- (DKind -> SgM DKind) -> DCxt -> SgM DCxt
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM DKind -> SgM DKind
forall (m :: * -> *). OptionsMonad m => DKind -> m DKind
promoteType_NC DCxt
types
DKind
rty' <- DKind -> SgM DKind
forall (m :: * -> *). OptionsMonad m => DKind -> m DKind
promoteType_NC DKind
rty
let indices :: DCxt
indices = (Name -> DKind) -> [Name] -> DCxt
forall a b. (a -> b) -> [a] -> [b]
map Name -> DKind
DVarT [Name]
indexNames
kindedIndices :: DCxt
kindedIndices = (DKind -> DKind -> DKind) -> DCxt -> DCxt -> DCxt
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith DKind -> DKind -> DKind
DSigT DCxt
indices DCxt
kinds
kvbs :: [DTyVarBndr Specificity]
kvbs | [DTyVarBndr Specificity] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [DTyVarBndr Specificity]
con_tvbs
= Specificity -> [DTyVarBndrUnit] -> [DTyVarBndr Specificity]
forall newFlag oldFlag.
newFlag -> [DTyVarBndr oldFlag] -> [DTyVarBndr newFlag]
changeDTVFlags Specificity
SpecifiedSpec (DCxt -> [DTyVarBndrUnit]
toposortTyVarsOf (DCxt
kinds DCxt -> DCxt -> DCxt
forall a. [a] -> [a] -> [a]
++ [DKind
rty'])) [DTyVarBndr Specificity]
-> [DTyVarBndr Specificity] -> [DTyVarBndr Specificity]
forall a. [a] -> [a] -> [a]
++
[DTyVarBndr Specificity]
con_tvbs
| Bool
otherwise
= [DTyVarBndr Specificity]
con_tvbs
all_tvbs :: [DTyVarBndr Specificity]
all_tvbs = [DTyVarBndr Specificity]
kvbs [DTyVarBndr Specificity]
-> [DTyVarBndr Specificity] -> [DTyVarBndr Specificity]
forall a. [a] -> [a] -> [a]
++ (Name -> DKind -> DTyVarBndr Specificity)
-> [Name] -> DCxt -> [DTyVarBndr Specificity]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (Name -> Specificity -> DKind -> DTyVarBndr Specificity
forall flag. Name -> flag -> DKind -> DTyVarBndr flag
`DKindedTV` Specificity
SpecifiedSpec) [Name]
indexNames DCxt
kinds
let mb_SingI_dec :: Int -> Maybe DDec
mb_SingI_dec :: Int -> Maybe DDec
mb_SingI_dec Int
k
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
numTypes
= let take_until_k :: [a] -> [a]
take_until_k = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take (Int
numTypes Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k) in
DDec -> Maybe DDec
forall a. a -> Maybe a
Just (DDec -> Maybe DDec) -> DDec -> Maybe DDec
forall a b. (a -> b) -> a -> b
$ Maybe Overlap
-> Maybe [DTyVarBndrUnit] -> DCxt -> DKind -> [DDec] -> DDec
DInstanceD Maybe Overlap
forall a. Maybe a
Nothing Maybe [DTyVarBndrUnit]
forall a. Maybe a
Nothing
((DKind -> DKind) -> DCxt -> DCxt
forall a b. (a -> b) -> [a] -> [b]
map (DKind -> DKind -> DKind
DAppT (Name -> DKind
DConT Name
singIName)) (DCxt -> DCxt
forall {a}. [a] -> [a]
take_until_k DCxt
indices))
(DKind -> DKind -> DKind
DAppT (Name -> DKind
DConT (Int -> Name
mkSingIName Int
k))
(DKind -> DCxt -> DKind
foldType DKind
pCon (DCxt -> DCxt
forall {a}. [a] -> [a]
take_until_k DCxt
kindedIndices)))
[DLetDec -> DDec
DLetDec (DLetDec -> DDec) -> DLetDec -> DDec
forall a b. (a -> b) -> a -> b
$ DPat -> DExp -> DLetDec
DValD (Name -> DPat
DVarP (Int -> Name
mkSingMethName Int
k))
(DExp -> [DExp] -> DExp
foldExp DExp
sCon (Int -> DExp -> [DExp]
forall a. Int -> a -> [a]
replicate (Int
numTypes Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k) (Name -> DExp
DVarE Name
singMethName)))]
| Bool
otherwise
= Maybe DDec
forall a. Maybe a
Nothing
[DDec] -> SgM ()
forall (m :: * -> *). MonadWriter [DDec] m => [DDec] -> m ()
emitDecs ([DDec] -> SgM ()) -> [DDec] -> SgM ()
forall a b. (a -> b) -> a -> b
$ (Int -> Maybe DDec) -> [Int] -> [DDec]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Int -> Maybe DDec
mb_SingI_dec [Int
0, Int
1, Int
2]
[DDec] -> SgM ()
forall (m :: * -> *). MonadWriter [DDec] m => [DDec] -> m ()
emitDecs ([DDec] -> SgM ()) -> SgM [DDec] -> SgM ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Name
-> NameSpace -> DCxt -> [Maybe DKind] -> Maybe DKind -> SgM [DDec]
singDefuns Name
name NameSpace
DataName [] ((DKind -> Maybe DKind) -> DCxt -> [Maybe DKind]
forall a b. (a -> b) -> [a] -> [b]
map DKind -> Maybe DKind
forall a. a -> Maybe a
Just DCxt
kinds) (DKind -> Maybe DKind
forall a. a -> Maybe a
Just DKind
rty')
DConFields
conFields <- case DConFields
fields of
DNormalC Bool
dInfix [DBangType]
bts -> Bool -> [DBangType] -> DConFields
DNormalC Bool
dInfix ([DBangType] -> DConFields) -> SgM [DBangType] -> SgM DConFields
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
(DBangType -> DKind -> SgM DBangType)
-> [DBangType] -> DCxt -> SgM [DBangType]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM (\(Bang
b, DKind
_) DKind
index -> Bang -> DKind -> SgM DBangType
mk_bang_type Bang
b DKind
index)
[DBangType]
bts DCxt
indices
DRecC [DVarBangType]
vbts -> Bool -> [DBangType] -> DConFields
DNormalC Bool
False ([DBangType] -> DConFields) -> SgM [DBangType] -> SgM DConFields
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
(DVarBangType -> DKind -> SgM DBangType)
-> [DVarBangType] -> DCxt -> SgM [DBangType]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM (\(Name
_, Bang
b, DKind
_) DKind
index -> Bang -> DKind -> SgM DBangType
mk_bang_type Bang
b DKind
index)
[DVarBangType]
vbts DCxt
indices
DCon -> SgM DCon
forall a. a -> SgM a
forall (m :: * -> *) a. Monad m => a -> m a
return (DCon -> SgM DCon) -> DCon -> SgM DCon
forall a b. (a -> b) -> a -> b
$ [DTyVarBndr Specificity]
-> DCxt -> Name -> DConFields -> DKind -> DCon
DCon [DTyVarBndr Specificity]
all_tvbs [] Name
sName DConFields
conFields
(Name -> DKind
DConT (Options -> Name -> Name
singledDataTypeName Options
opts Name
dataName) DKind -> DKind -> DKind
`DAppT`
(DKind -> DCxt -> DKind
foldType DKind
pCon DCxt
indices DKind -> DKind -> DKind
`DSigT` DKind
rty'))
where
mk_source_unpackedness :: SourceUnpackedness -> SgM SourceUnpackedness
mk_source_unpackedness :: SourceUnpackedness -> SgM SourceUnpackedness
mk_source_unpackedness SourceUnpackedness
su = case SourceUnpackedness
su of
SourceUnpackedness
NoSourceUnpackedness -> SourceUnpackedness -> SgM SourceUnpackedness
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SourceUnpackedness
su
SourceUnpackedness
SourceNoUnpack -> SourceUnpackedness -> SgM SourceUnpackedness
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SourceUnpackedness
su
SourceUnpackedness
SourceUnpack -> do
String -> SgM ()
forall (q :: * -> *). Quasi q => String -> q ()
qReportWarning String
"{-# UNPACK #-} pragmas are ignored by `singletons-th`."
SourceUnpackedness -> SgM SourceUnpackedness
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SourceUnpackedness
NoSourceUnpackedness
mk_bang :: Bang -> SgM Bang
mk_bang :: Bang -> SgM Bang
mk_bang (Bang SourceUnpackedness
su SourceStrictness
ss) = do SourceUnpackedness
su' <- SourceUnpackedness -> SgM SourceUnpackedness
mk_source_unpackedness SourceUnpackedness
su
Bang -> SgM Bang
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bang -> SgM Bang) -> Bang -> SgM Bang
forall a b. (a -> b) -> a -> b
$ SourceUnpackedness -> SourceStrictness -> Bang
Bang SourceUnpackedness
su' SourceStrictness
ss
mk_bang_type :: Bang -> DType -> SgM DBangType
mk_bang_type :: Bang -> DKind -> SgM DBangType
mk_bang_type Bang
b DKind
index = do Bang
b' <- Bang -> SgM Bang
mk_bang Bang
b
DBangType -> SgM DBangType
forall a. a -> SgM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bang
b', DKind -> DKind -> DKind
DAppT DKind
singFamily DKind
index)
singDataSAK ::
MonadFail q
=> DKind
-> [DTyVarBndrVis]
-> DKind
-> q DKind
singDataSAK :: forall (q :: * -> *).
MonadFail q =>
DKind -> [DTyVarBndrVis] -> DKind -> q DKind
singDataSAK DKind
data_sak [DTyVarBndrVis]
data_bndrs DKind
data_k = do
let data_sak_free_tvbs :: [DTyVarBndr Specificity]
data_sak_free_tvbs =
Specificity -> [DTyVarBndrUnit] -> [DTyVarBndr Specificity]
forall newFlag oldFlag.
newFlag -> [DTyVarBndr oldFlag] -> [DTyVarBndr newFlag]
changeDTVFlags Specificity
SpecifiedSpec ([DTyVarBndrUnit] -> [DTyVarBndr Specificity])
-> [DTyVarBndrUnit] -> [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ DCxt -> [DTyVarBndrUnit]
toposortTyVarsOf [DKind
data_sak]
data_sak' :: DKind
data_sak' = DForallTelescope -> DKind -> DKind
DForallT ([DTyVarBndr Specificity] -> DForallTelescope
DForallInvis [DTyVarBndr Specificity]
data_sak_free_tvbs) DKind
data_sak
let (DFunArgs
data_sak_args, DKind
_) = DKind -> (DFunArgs, DKind)
unravelDType DKind
data_sak'
[DTyVarBndr Specificity]
sing_sak_tvbs <- DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
forall (q :: * -> *).
MonadFail q =>
DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
matchUpSigWithDecl DFunArgs
data_sak_args [DTyVarBndrVis]
data_bndrs
let invis_data_sak_args :: [DTyVarBndr Specificity]
invis_data_sak_args = DFunArgs -> [DTyVarBndr Specificity]
filterInvisTvbArgs DFunArgs
data_sak_args
invis_data_sak_arg_nms :: [Name]
invis_data_sak_arg_nms = (DTyVarBndr Specificity -> Name)
-> [DTyVarBndr Specificity] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map DTyVarBndr Specificity -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName [DTyVarBndr Specificity]
invis_data_sak_args
invis_data_bndrs :: [DTyVarBndrUnit]
invis_data_bndrs = [DTyVarBndrVis] -> [DTyVarBndrUnit]
forall flag. [DTyVarBndr flag] -> [DTyVarBndrUnit]
toposortKindVarsOfTvbs [DTyVarBndrVis]
data_bndrs
invis_data_bndr_nms :: [Name]
invis_data_bndr_nms = (DTyVarBndrUnit -> Name) -> [DTyVarBndrUnit] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map DTyVarBndrUnit -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName [DTyVarBndrUnit]
invis_data_bndrs
swizzle_env :: Map Name Name
swizzle_env =
[(Name, Name)] -> Map Name Name
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Name, Name)] -> Map Name Name)
-> [(Name, Name)] -> Map Name Name
forall a b. (a -> b) -> a -> b
$ [Name] -> [Name] -> [(Name, Name)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Name]
invis_data_sak_arg_nms [Name]
invis_data_bndr_nms
(DSubst
_, [DTyVarBndr Specificity]
swizzled_sing_sak_tvbs) =
(DSubst
-> DTyVarBndr Specificity -> (DSubst, DTyVarBndr Specificity))
-> DSubst
-> [DTyVarBndr Specificity]
-> (DSubst, [DTyVarBndr Specificity])
forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL (Map Name Name
-> DSubst
-> DTyVarBndr Specificity
-> (DSubst, DTyVarBndr Specificity)
swizzleTvb Map Name Name
swizzle_env) DSubst
forall k a. Map k a
Map.empty [DTyVarBndr Specificity]
sing_sak_tvbs
DKind -> q DKind
forall a. a -> q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DKind -> q DKind) -> DKind -> q DKind
forall a b. (a -> b) -> a -> b
$ DForallTelescope -> DKind -> DKind
DForallT ([DTyVarBndr Specificity] -> DForallTelescope
DForallInvis [DTyVarBndr Specificity]
swizzled_sing_sak_tvbs)
(DKind -> DKind) -> DKind -> DKind
forall a b. (a -> b) -> a -> b
$ DKind
DArrowT DKind -> DKind -> DKind
`DAppT` DKind
data_k DKind -> DKind -> DKind
`DAppT` Name -> DKind
DConT Name
typeKindName
matchUpSigWithDecl ::
forall q.
MonadFail q
=> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndrSpec]
matchUpSigWithDecl :: forall (q :: * -> *).
MonadFail q =>
DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
matchUpSigWithDecl = DSubst -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
go_fun_args DSubst
forall k a. Map k a
Map.empty
where
go_fun_args ::
DSubst
-> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndrSpec]
go_fun_args :: DSubst -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
go_fun_args DSubst
_ DFunArgs
DFANil [] =
[DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a. a -> q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
go_fun_args DSubst
_ DFunArgs
DFANil [DTyVarBndrVis]
data_bndrs =
String -> q [DTyVarBndr Specificity]
forall a. String -> q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> q [DTyVarBndr Specificity])
-> String -> q [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ String
"matchUpSigWithDecl.go_fun_args: Too many binders: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [DTyVarBndrVis] -> String
forall a. Show a => a -> String
show [DTyVarBndrVis]
data_bndrs
go_fun_args DSubst
_ (DFACxt{}) [DTyVarBndrVis]
_ =
String -> q [DTyVarBndr Specificity]
forall a. String -> q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"matchUpSigWithDecl.go_fun_args: Unexpected kind-level constraint"
go_fun_args DSubst
subst (DFAForalls (DForallInvis [DTyVarBndr Specificity]
tvbs) DFunArgs
sig_args) [DTyVarBndrVis]
data_bndrs =
DSubst
-> [DTyVarBndr Specificity]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_invis_tvbs DSubst
subst [DTyVarBndr Specificity]
tvbs DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
go_fun_args DSubst
subst (DFAForalls (DForallVis [DTyVarBndrUnit]
tvbs) DFunArgs
sig_args) [DTyVarBndrVis]
data_bndrs =
DSubst
-> [DTyVarBndrUnit]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_vis_tvbs DSubst
subst [DTyVarBndrUnit]
tvbs DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
go_fun_args DSubst
subst (DFAAnon DKind
anon DFunArgs
sig_args) (DTyVarBndrVis
data_bndr:[DTyVarBndrVis]
data_bndrs) = do
let data_bndr_name :: Name
data_bndr_name = DTyVarBndrVis -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName DTyVarBndrVis
data_bndr
mb_data_bndr_kind :: Maybe DKind
mb_data_bndr_kind = DTyVarBndrVis -> Maybe DKind
forall flag. DTyVarBndr flag -> Maybe DKind
extractTvbKind DTyVarBndrVis
data_bndr
anon' :: DKind
anon' = DSubst -> DKind -> DKind
substType DSubst
subst DKind
anon
anon'' :: DKind
anon'' =
case Maybe DKind
mb_data_bndr_kind of
Maybe DKind
Nothing -> DKind
anon'
Just DKind
data_bndr_kind ->
let mb_match_subst :: Maybe DSubst
mb_match_subst = IgnoreKinds -> DKind -> DKind -> Maybe DSubst
matchTy IgnoreKinds
NoIgnore DKind
data_bndr_kind DKind
anon' in
DKind -> (DSubst -> DKind) -> Maybe DSubst -> DKind
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DKind
data_bndr_kind (DSubst -> DKind -> DKind
`substType` DKind
data_bndr_kind) Maybe DSubst
mb_match_subst
[DTyVarBndr Specificity]
sig_args' <- DSubst -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
go_fun_args DSubst
subst DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
[DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a. a -> q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([DTyVarBndr Specificity] -> q [DTyVarBndr Specificity])
-> [DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ Name -> Specificity -> DKind -> DTyVarBndr Specificity
forall flag. Name -> flag -> DKind -> DTyVarBndr flag
DKindedTV Name
data_bndr_name Specificity
SpecifiedSpec DKind
anon'' DTyVarBndr Specificity
-> [DTyVarBndr Specificity] -> [DTyVarBndr Specificity]
forall a. a -> [a] -> [a]
: [DTyVarBndr Specificity]
sig_args'
go_fun_args DSubst
_ DFunArgs
_ [] =
String -> q [DTyVarBndr Specificity]
forall a. String -> q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"matchUpSigWithDecl.go_fun_args: Too few binders"
go_invis_tvbs :: DSubst -> [DTyVarBndrSpec] -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndrSpec]
go_invis_tvbs :: DSubst
-> [DTyVarBndr Specificity]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_invis_tvbs DSubst
subst [] DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs =
DSubst -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
go_fun_args DSubst
subst DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
go_invis_tvbs DSubst
_ (DTyVarBndr Specificity
_:[DTyVarBndr Specificity]
_) DFunArgs
_ [] =
String -> q [DTyVarBndr Specificity]
forall a. String -> q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> q [DTyVarBndr Specificity])
-> String -> q [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ String
"matchUpSigWithDecl.go_invis_tvbs: Too few binders"
go_invis_tvbs DSubst
subst (DTyVarBndr Specificity
invis_tvb:[DTyVarBndr Specificity]
invis_tvbs) DFunArgs
sig_args data_bndrss :: [DTyVarBndrVis]
data_bndrss@(DTyVarBndrVis
data_bndr:[DTyVarBndrVis]
data_bndrs) =
case DTyVarBndrVis -> BndrVis
forall flag. DTyVarBndr flag -> flag
extractTvbFlag DTyVarBndrVis
data_bndr of
BndrVis
BndrReq -> do
let (DSubst
subst', DTyVarBndr Specificity
invis_tvb') = DSubst
-> DTyVarBndr Specificity -> (DSubst, DTyVarBndr Specificity)
forall flag. DSubst -> DTyVarBndr flag -> (DSubst, DTyVarBndr flag)
substTvb DSubst
subst DTyVarBndr Specificity
invis_tvb
[DTyVarBndr Specificity]
sig_args' <- DSubst
-> [DTyVarBndr Specificity]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_invis_tvbs DSubst
subst' [DTyVarBndr Specificity]
invis_tvbs DFunArgs
sig_args [DTyVarBndrVis]
data_bndrss
[DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a. a -> q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([DTyVarBndr Specificity] -> q [DTyVarBndr Specificity])
-> [DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ DTyVarBndr Specificity
invis_tvb' DTyVarBndr Specificity
-> [DTyVarBndr Specificity] -> [DTyVarBndr Specificity]
forall a. a -> [a] -> [a]
: [DTyVarBndr Specificity]
sig_args'
BndrVis
BndrInvis -> do
let (DSubst
subst', DTyVarBndr Specificity
sig_tvb) = DSubst
-> DTyVarBndr Specificity
-> DTyVarBndrVis
-> (DSubst, DTyVarBndr Specificity)
forall flag.
DSubst
-> DTyVarBndr flag
-> DTyVarBndrVis
-> (DSubst, DTyVarBndr Specificity)
match_tvbs DSubst
subst DTyVarBndr Specificity
invis_tvb DTyVarBndrVis
data_bndr
[DTyVarBndr Specificity]
sig_args' <- DSubst
-> [DTyVarBndr Specificity]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_invis_tvbs DSubst
subst' [DTyVarBndr Specificity]
invis_tvbs DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
[DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a. a -> q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DTyVarBndr Specificity
sig_tvb DTyVarBndr Specificity
-> [DTyVarBndr Specificity] -> [DTyVarBndr Specificity]
forall a. a -> [a] -> [a]
: [DTyVarBndr Specificity]
sig_args')
go_vis_tvbs :: DSubst -> [DTyVarBndrUnit] -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndrSpec]
go_vis_tvbs :: DSubst
-> [DTyVarBndrUnit]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_vis_tvbs DSubst
subst [] DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs =
DSubst -> DFunArgs -> [DTyVarBndrVis] -> q [DTyVarBndr Specificity]
go_fun_args DSubst
subst DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
go_vis_tvbs DSubst
_ (DTyVarBndrUnit
_:[DTyVarBndrUnit]
_) DFunArgs
_ [] =
String -> q [DTyVarBndr Specificity]
forall a. String -> q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> q [DTyVarBndr Specificity])
-> String -> q [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ String
"matchUpSigWithDecl.go_vis_tvbs: Too few binders"
go_vis_tvbs DSubst
subst (DTyVarBndrUnit
vis_tvb:[DTyVarBndrUnit]
vis_tvbs) DFunArgs
sig_args (DTyVarBndrVis
data_bndr:[DTyVarBndrVis]
data_bndrs) = do
case DTyVarBndrVis -> BndrVis
forall flag. DTyVarBndr flag -> flag
extractTvbFlag DTyVarBndrVis
data_bndr of
BndrVis
BndrReq -> do
let (DSubst
subst', DTyVarBndr Specificity
sig_tvb) = DSubst
-> DTyVarBndrUnit
-> DTyVarBndrVis
-> (DSubst, DTyVarBndr Specificity)
forall flag.
DSubst
-> DTyVarBndr flag
-> DTyVarBndrVis
-> (DSubst, DTyVarBndr Specificity)
match_tvbs DSubst
subst DTyVarBndrUnit
vis_tvb DTyVarBndrVis
data_bndr
[DTyVarBndr Specificity]
sig_args' <- DSubst
-> [DTyVarBndrUnit]
-> DFunArgs
-> [DTyVarBndrVis]
-> q [DTyVarBndr Specificity]
go_vis_tvbs DSubst
subst' [DTyVarBndrUnit]
vis_tvbs DFunArgs
sig_args [DTyVarBndrVis]
data_bndrs
[DTyVarBndr Specificity] -> q [DTyVarBndr Specificity]
forall a. a -> q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DTyVarBndr Specificity
sig_tvb DTyVarBndr Specificity
-> [DTyVarBndr Specificity] -> [DTyVarBndr Specificity]
forall a. a -> [a] -> [a]
: [DTyVarBndr Specificity]
sig_args')
BndrVis
BndrInvis ->
String -> q [DTyVarBndr Specificity]
forall a. String -> q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> q [DTyVarBndr Specificity])
-> String -> q [DTyVarBndr Specificity]
forall a b. (a -> b) -> a -> b
$ String
"matchUpSigWithDecl.go_vis_tvbs: Expected visible binder, encountered invisible binder: "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ DTyVarBndrVis -> String
forall a. Show a => a -> String
show DTyVarBndrVis
data_bndr
match_tvbs :: DSubst -> DTyVarBndr flag -> DTyVarBndrVis -> (DSubst, DTyVarBndrSpec)
match_tvbs :: forall flag.
DSubst
-> DTyVarBndr flag
-> DTyVarBndrVis
-> (DSubst, DTyVarBndr Specificity)
match_tvbs DSubst
subst DTyVarBndr flag
sig_tvb DTyVarBndrVis
data_bndr =
let data_bndr_name :: Name
data_bndr_name = DTyVarBndrVis -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName DTyVarBndrVis
data_bndr
mb_data_bndr_kind :: Maybe DKind
mb_data_bndr_kind = DTyVarBndrVis -> Maybe DKind
forall flag. DTyVarBndr flag -> Maybe DKind
extractTvbKind DTyVarBndrVis
data_bndr
sig_tvb_name :: Name
sig_tvb_name = DTyVarBndr flag -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName DTyVarBndr flag
sig_tvb
mb_sig_tvb_kind :: Maybe DKind
mb_sig_tvb_kind = DSubst -> DKind -> DKind
substType DSubst
subst (DKind -> DKind) -> Maybe DKind -> Maybe DKind
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DTyVarBndr flag -> Maybe DKind
forall flag. DTyVarBndr flag -> Maybe DKind
extractTvbKind DTyVarBndr flag
sig_tvb
mb_kind :: Maybe DKind
mb_kind :: Maybe DKind
mb_kind =
case (Maybe DKind
mb_data_bndr_kind, Maybe DKind
mb_sig_tvb_kind) of
(Maybe DKind
Nothing, Maybe DKind
Nothing) -> Maybe DKind
forall a. Maybe a
Nothing
(Just DKind
data_bndr_kind, Maybe DKind
Nothing) -> DKind -> Maybe DKind
forall a. a -> Maybe a
Just DKind
data_bndr_kind
(Maybe DKind
Nothing, Just DKind
sig_tvb_kind) -> DKind -> Maybe DKind
forall a. a -> Maybe a
Just DKind
sig_tvb_kind
(Just DKind
data_bndr_kind, Just DKind
sig_tvb_kind) -> do
DSubst
match_subst <- IgnoreKinds -> DKind -> DKind -> Maybe DSubst
matchTy IgnoreKinds
NoIgnore DKind
data_bndr_kind DKind
sig_tvb_kind
DKind -> Maybe DKind
forall a. a -> Maybe a
Just (DKind -> Maybe DKind) -> DKind -> Maybe DKind
forall a b. (a -> b) -> a -> b
$ DSubst -> DKind -> DKind
substType DSubst
match_subst DKind
data_bndr_kind
subst' :: DSubst
subst' = Name -> DKind -> DSubst -> DSubst
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Name
sig_tvb_name (Name -> DKind
DVarT Name
data_bndr_name) DSubst
subst
sig_tvb' :: DTyVarBndr Specificity
sig_tvb' = case Maybe DKind
mb_kind of
Maybe DKind
Nothing -> Name -> Specificity -> DTyVarBndr Specificity
forall flag. Name -> flag -> DTyVarBndr flag
DPlainTV Name
data_bndr_name Specificity
SpecifiedSpec
Just DKind
kind -> Name -> Specificity -> DKind -> DTyVarBndr Specificity
forall flag. Name -> flag -> DKind -> DTyVarBndr flag
DKindedTV Name
data_bndr_name Specificity
SpecifiedSpec DKind
kind in
(DSubst
subst', DTyVarBndr Specificity
sig_tvb')
swizzleTvb :: Map Name Name -> DSubst -> DTyVarBndrSpec -> (DSubst, DTyVarBndrSpec)
swizzleTvb :: Map Name Name
-> DSubst
-> DTyVarBndr Specificity
-> (DSubst, DTyVarBndr Specificity)
swizzleTvb Map Name Name
swizzle_env DSubst
subst DTyVarBndr Specificity
tvb =
(DSubst
subst', DTyVarBndr Specificity
tvb2)
where
subst' :: DSubst
subst' = Name -> DKind -> DSubst -> DSubst
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Name
tvb_name (Name -> DKind
DVarT (DTyVarBndr Specificity -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName DTyVarBndr Specificity
tvb2)) DSubst
subst
tvb_name :: Name
tvb_name = DTyVarBndr Specificity -> Name
forall flag. DTyVarBndr flag -> Name
extractTvbName DTyVarBndr Specificity
tvb
tvb1 :: DTyVarBndr Specificity
tvb1 = (DKind -> DKind)
-> DTyVarBndr Specificity -> DTyVarBndr Specificity
forall flag. (DKind -> DKind) -> DTyVarBndr flag -> DTyVarBndr flag
mapDTVKind (DSubst -> DKind -> DKind
substType DSubst
subst) DTyVarBndr Specificity
tvb
tvb2 :: DTyVarBndr Specificity
tvb2 =
case Name -> Map Name Name -> Maybe Name
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Name
tvb_name Map Name Name
swizzle_env of
Just Name
user_name -> (Name -> Name) -> DTyVarBndr Specificity -> DTyVarBndr Specificity
forall flag. (Name -> Name) -> DTyVarBndr flag -> DTyVarBndr flag
mapDTVName (Name -> Name -> Name
forall a b. a -> b -> a
const Name
user_name) DTyVarBndr Specificity
tvb1
Maybe Name
Nothing -> DTyVarBndr Specificity
tvb1