{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module GHC.Builtin.Types (
mkWiredInTyConName,
mkWiredInIdName,
wiredInTyCons, isBuiltInOcc_maybe,
boolTy, boolTyCon, boolTyCon_RDR, boolTyConName,
trueDataCon, trueDataConId, true_RDR,
falseDataCon, falseDataConId, false_RDR,
promotedFalseDataCon, promotedTrueDataCon,
orderingTyCon,
ordLTDataCon, ordLTDataConId,
ordEQDataCon, ordEQDataConId,
ordGTDataCon, ordGTDataConId,
promotedLTDataCon, promotedEQDataCon, promotedGTDataCon,
boxingDataCon_maybe,
charTyCon, charDataCon, charTyCon_RDR,
charTy, stringTy, charTyConName, stringTyCon_RDR,
doubleTyCon, doubleDataCon, doubleTy, doubleTyConName,
floatTyCon, floatDataCon, floatTy, floatTyConName,
intTyCon, intDataCon, intTyCon_RDR, intDataCon_RDR, intTyConName,
intTy,
wordTyCon, wordDataCon, wordTyConName, wordTy,
word8TyCon, word8DataCon, word8TyConName, word8Ty,
listTyCon, listTyCon_RDR, listTyConName, listTyConKey,
nilDataCon, nilDataConName, nilDataConKey,
consDataCon_RDR, consDataCon, consDataConName,
promotedNilDataCon, promotedConsDataCon,
mkListTy, mkPromotedListTy,
maybeTyCon, maybeTyConName,
nothingDataCon, nothingDataConName, promotedNothingDataCon,
justDataCon, justDataConName, promotedJustDataCon,
mkTupleTy, mkTupleTy1, mkBoxedTupleTy, mkTupleStr,
tupleTyCon, tupleDataCon, tupleTyConName, tupleDataConName,
promotedTupleDataCon,
unitTyCon, unitDataCon, unitDataConId, unitTy, unitTyConKey,
pairTyCon,
unboxedUnitTyCon, unboxedUnitDataCon,
unboxedTupleKind, unboxedSumKind,
cTupleTyConName, cTupleTyConNames, isCTupleTyConName,
cTupleTyConNameArity_maybe,
cTupleDataConName, cTupleDataConNames,
anyTyCon, anyTy, anyTypeOfKind,
makeRecoveryTyCon,
mkSumTy, sumTyCon, sumDataCon,
typeNatKindCon, typeNatKind, typeSymbolKindCon, typeSymbolKind,
isLiftedTypeKindTyConName, liftedTypeKind,
typeToTypeKind, constraintKind,
liftedTypeKindTyCon, constraintKindTyCon, constraintKindTyConName,
liftedTypeKindTyConName,
heqTyCon, heqTyConName, heqClass, heqDataCon,
eqTyCon, eqTyConName, eqClass, eqDataCon, eqTyCon_RDR,
coercibleTyCon, coercibleTyConName, coercibleDataCon, coercibleClass,
runtimeRepTyCon, vecCountTyCon, vecElemTyCon,
runtimeRepTy, liftedRepTy, liftedRepDataCon, liftedRepDataConTyCon,
vecRepDataConTyCon, tupleRepDataConTyCon, sumRepDataConTyCon,
liftedRepDataConTy, unliftedRepDataConTy,
intRepDataConTy,
int8RepDataConTy, int16RepDataConTy, int32RepDataConTy, int64RepDataConTy,
wordRepDataConTy,
word8RepDataConTy, word16RepDataConTy, word32RepDataConTy, word64RepDataConTy,
addrRepDataConTy,
floatRepDataConTy, doubleRepDataConTy,
vec2DataConTy, vec4DataConTy, vec8DataConTy, vec16DataConTy, vec32DataConTy,
vec64DataConTy,
int8ElemRepDataConTy, int16ElemRepDataConTy, int32ElemRepDataConTy,
int64ElemRepDataConTy, word8ElemRepDataConTy, word16ElemRepDataConTy,
word32ElemRepDataConTy, word64ElemRepDataConTy, floatElemRepDataConTy,
doubleElemRepDataConTy,
multiplicityTyConName, oneDataConName, manyDataConName, multiplicityTy,
multiplicityTyCon, oneDataCon, manyDataCon, oneDataConTy, manyDataConTy,
oneDataConTyCon, manyDataConTyCon,
multMulTyCon,
unrestrictedFunTyCon, unrestrictedFunTyConName,
integerTy, integerTyCon, integerTyConName,
integerISDataCon, integerISDataConName,
integerIPDataCon, integerIPDataConName,
integerINDataCon, integerINDataConName,
naturalTy, naturalTyCon, naturalTyConName,
naturalNSDataCon, naturalNSDataConName,
naturalNBDataCon, naturalNBDataConName
) where
#include "HsVersions.h"
import GHC.Prelude
import {-# SOURCE #-} GHC.Types.Id.Make ( mkDataConWorkId, mkDictSelId )
import GHC.Builtin.Names
import GHC.Builtin.Types.Prim
import {-# SOURCE #-} GHC.Builtin.Uniques
import GHC.Core.Coercion.Axiom
import GHC.Types.Id
import GHC.Types.Var (VarBndr (Bndr))
import GHC.Settings.Constants ( mAX_TUPLE_SIZE, mAX_CTUPLE_SIZE, mAX_SUM_SIZE )
import GHC.Unit.Module ( Module )
import GHC.Core.Type
import GHC.Types.RepType
import GHC.Core.DataCon
import {-# SOURCE #-} GHC.Core.ConLike
import GHC.Core.TyCon
import GHC.Core.Class ( Class, mkClass )
import GHC.Types.Name.Reader
import GHC.Types.Name as Name
import GHC.Types.Name.Env ( NameEnv, mkNameEnv, lookupNameEnv, lookupNameEnv_NF )
import GHC.Types.Name.Set ( NameSet, mkNameSet, elemNameSet )
import GHC.Types.Basic
import GHC.Types.ForeignCall
import GHC.Types.SrcLoc ( noSrcSpan )
import GHC.Types.Unique
import Data.Array
import GHC.Data.FastString
import GHC.Utils.Outputable
import GHC.Utils.Misc
import GHC.Data.BooleanFormula ( mkAnd )
import qualified Data.ByteString.Char8 as BS
import Data.List ( elemIndex )
alpha_tyvar :: [TyVar]
alpha_tyvar :: [TyVar]
alpha_tyvar = [TyVar
alphaTyVar]
alpha_ty :: [Type]
alpha_ty :: [Type]
alpha_ty = [Type
alphaTy]
wiredInTyCons :: [TyCon]
wiredInTyCons :: [TyCon]
wiredInTyCons = [
TyCon
unitTyCon
, TyCon
unboxedUnitTyCon
, TyCon
anyTyCon
, TyCon
boolTyCon
, TyCon
charTyCon
, TyCon
stringTyCon
, TyCon
doubleTyCon
, TyCon
floatTyCon
, TyCon
intTyCon
, TyCon
wordTyCon
, TyCon
word8TyCon
, TyCon
listTyCon
, TyCon
orderingTyCon
, TyCon
maybeTyCon
, TyCon
heqTyCon
, TyCon
eqTyCon
, TyCon
coercibleTyCon
, TyCon
typeNatKindCon
, TyCon
typeSymbolKindCon
, TyCon
runtimeRepTyCon
, TyCon
vecCountTyCon
, TyCon
vecElemTyCon
, TyCon
constraintKindTyCon
, TyCon
liftedTypeKindTyCon
, TyCon
multiplicityTyCon
, TyCon
naturalTyCon
, TyCon
integerTyCon
]
mkWiredInTyConName :: BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName :: BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
built_in Module
modu FastString
fs Unique
unique TyCon
tycon
= Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu (FastString -> OccName
mkTcOccFS FastString
fs) Unique
unique
(TyCon -> TyThing
ATyCon TyCon
tycon)
BuiltInSyntax
built_in
mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
built_in Module
modu FastString
fs Unique
unique DataCon
datacon
= Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu (FastString -> OccName
mkDataOccFS FastString
fs) Unique
unique
(ConLike -> TyThing
AConLike (DataCon -> ConLike
RealDataCon DataCon
datacon))
BuiltInSyntax
built_in
mkWiredInIdName :: Module -> FastString -> Unique -> Id -> Name
mkWiredInIdName :: Module -> FastString -> Unique -> TyVar -> Name
mkWiredInIdName Module
mod FastString
fs Unique
uniq TyVar
id
= Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
mod (NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
Name.varName FastString
fs) Unique
uniq (TyVar -> TyThing
AnId TyVar
id) BuiltInSyntax
UserSyntax
eqTyConName, eqDataConName, eqSCSelIdName :: Name
eqTyConName :: Name
eqTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"~") Unique
eqTyConKey TyCon
eqTyCon
eqDataConName :: Name
eqDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Eq#") Unique
eqDataConKey DataCon
eqDataCon
eqSCSelIdName :: Name
eqSCSelIdName = Module -> FastString -> Unique -> TyVar -> Name
mkWiredInIdName Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"eq_sel") Unique
eqSCSelIdKey TyVar
eqSCSelId
eqTyCon_RDR :: RdrName
eqTyCon_RDR :: RdrName
eqTyCon_RDR = Name -> RdrName
nameRdrName Name
eqTyConName
heqTyConName, heqDataConName, heqSCSelIdName :: Name
heqTyConName :: Name
heqTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"~~") Unique
heqTyConKey TyCon
heqTyCon
heqDataConName :: Name
heqDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"HEq#") Unique
heqDataConKey DataCon
heqDataCon
heqSCSelIdName :: Name
heqSCSelIdName = Module -> FastString -> Unique -> TyVar -> Name
mkWiredInIdName Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"heq_sel") Unique
heqSCSelIdKey TyVar
heqSCSelId
coercibleTyConName, coercibleDataConName, coercibleSCSelIdName :: Name
coercibleTyConName :: Name
coercibleTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Coercible") Unique
coercibleTyConKey TyCon
coercibleTyCon
coercibleDataConName :: Name
coercibleDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"MkCoercible") Unique
coercibleDataConKey DataCon
coercibleDataCon
coercibleSCSelIdName :: Name
coercibleSCSelIdName = Module -> FastString -> Unique -> TyVar -> Name
mkWiredInIdName Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"coercible_sel") Unique
coercibleSCSelIdKey TyVar
coercibleSCSelId
charTyConName, charDataConName, intTyConName, intDataConName, stringTyConName :: Name
charTyConName :: Name
charTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Char") Unique
charTyConKey TyCon
charTyCon
charDataConName :: Name
charDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"C#") Unique
charDataConKey DataCon
charDataCon
stringTyConName :: Name
stringTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_BASE ([Char] -> FastString
fsLit [Char]
"String") Unique
stringTyConKey TyCon
stringTyCon
intTyConName :: Name
intTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Int") Unique
intTyConKey TyCon
intTyCon
intDataConName :: Name
intDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"I#") Unique
intDataConKey DataCon
intDataCon
boolTyConName, falseDataConName, trueDataConName :: Name
boolTyConName :: Name
boolTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Bool") Unique
boolTyConKey TyCon
boolTyCon
falseDataConName :: Name
falseDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"False") Unique
falseDataConKey DataCon
falseDataCon
trueDataConName :: Name
trueDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"True") Unique
trueDataConKey DataCon
trueDataCon
listTyConName, nilDataConName, consDataConName :: Name
listTyConName :: Name
listTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
BuiltInSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"[]") Unique
listTyConKey TyCon
listTyCon
nilDataConName :: Name
nilDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
BuiltInSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"[]") Unique
nilDataConKey DataCon
nilDataCon
consDataConName :: Name
consDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
BuiltInSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
":") Unique
consDataConKey DataCon
consDataCon
maybeTyConName, nothingDataConName, justDataConName :: Name
maybeTyConName :: Name
maybeTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_MAYBE ([Char] -> FastString
fsLit [Char]
"Maybe")
Unique
maybeTyConKey TyCon
maybeTyCon
nothingDataConName :: Name
nothingDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_MAYBE ([Char] -> FastString
fsLit [Char]
"Nothing")
Unique
nothingDataConKey DataCon
nothingDataCon
justDataConName :: Name
justDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_MAYBE ([Char] -> FastString
fsLit [Char]
"Just")
Unique
justDataConKey DataCon
justDataCon
wordTyConName, wordDataConName, word8TyConName, word8DataConName :: Name
wordTyConName :: Name
wordTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Word") Unique
wordTyConKey TyCon
wordTyCon
wordDataConName :: Name
wordDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"W#") Unique
wordDataConKey DataCon
wordDataCon
word8TyConName :: Name
word8TyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_WORD ([Char] -> FastString
fsLit [Char]
"Word8") Unique
word8TyConKey TyCon
word8TyCon
word8DataConName :: Name
word8DataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_WORD ([Char] -> FastString
fsLit [Char]
"W8#") Unique
word8DataConKey DataCon
word8DataCon
floatTyConName, floatDataConName, doubleTyConName, doubleDataConName :: Name
floatTyConName :: Name
floatTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Float") Unique
floatTyConKey TyCon
floatTyCon
floatDataConName :: Name
floatDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"F#") Unique
floatDataConKey DataCon
floatDataCon
doubleTyConName :: Name
doubleTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Double") Unique
doubleTyConKey TyCon
doubleTyCon
doubleDataConName :: Name
doubleDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"D#") Unique
doubleDataConKey DataCon
doubleDataCon
anyTyConName :: Name
anyTyConName :: Name
anyTyConName =
BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Any") Unique
anyTyConKey TyCon
anyTyCon
anyTyCon :: TyCon
anyTyCon :: TyCon
anyTyCon = Name
-> [TyConBinder]
-> Type
-> Maybe Name
-> FamTyConFlav
-> Maybe Class
-> Injectivity
-> TyCon
mkFamilyTyCon Name
anyTyConName [TyConBinder]
binders Type
res_kind Maybe Name
forall a. Maybe a
Nothing
(Maybe (CoAxiom Branched) -> FamTyConFlav
ClosedSynFamilyTyCon Maybe (CoAxiom Branched)
forall a. Maybe a
Nothing)
Maybe Class
forall a. Maybe a
Nothing
Injectivity
NotInjective
where
binders :: [TyConBinder]
binders@[TyConBinder
kv] = [Type] -> [TyConBinder]
mkTemplateKindTyConBinders [Type
liftedTypeKind]
res_kind :: Type
res_kind = TyVar -> Type
mkTyVarTy (TyConBinder -> TyVar
forall tv argf. VarBndr tv argf -> tv
binderVar TyConBinder
kv)
anyTy :: Type
anyTy :: Type
anyTy = TyCon -> Type
mkTyConTy TyCon
anyTyCon
anyTypeOfKind :: Kind -> Type
anyTypeOfKind :: Type -> Type
anyTypeOfKind Type
kind = TyCon -> [Type] -> Type
mkTyConApp TyCon
anyTyCon [Type
kind]
makeRecoveryTyCon :: TyCon -> TyCon
makeRecoveryTyCon :: TyCon -> TyCon
makeRecoveryTyCon TyCon
tc
= Name
-> [TyConBinder]
-> Type
-> [(Name, TyVar)]
-> Bool
-> TyConFlavour
-> TyCon
mkTcTyCon (TyCon -> Name
tyConName TyCon
tc)
[TyConBinder]
bndrs Type
res_kind
[(Name, TyVar)]
noTcTyConScopedTyVars
Bool
True
TyConFlavour
flavour
where
flavour :: TyConFlavour
flavour = TyCon -> TyConFlavour
tyConFlavour TyCon
tc
[TyVar
kv] = [Type] -> [TyVar]
mkTemplateKindVars [Type
liftedTypeKind]
([TyConBinder]
bndrs, Type
res_kind)
= case TyConFlavour
flavour of
TyConFlavour
PromotedDataConFlavour -> ([ArgFlag -> TyVar -> TyConBinder
mkNamedTyConBinder ArgFlag
Inferred TyVar
kv], TyVar -> Type
mkTyVarTy TyVar
kv)
TyConFlavour
_ -> (TyCon -> [TyConBinder]
tyConBinders TyCon
tc, TyCon -> Type
tyConResKind TyCon
tc)
typeNatKindConName, typeSymbolKindConName :: Name
typeNatKindConName :: Name
typeNatKindConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Nat") Unique
typeNatKindConNameKey TyCon
typeNatKindCon
typeSymbolKindConName :: Name
typeSymbolKindConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Symbol") Unique
typeSymbolKindConNameKey TyCon
typeSymbolKindCon
constraintKindTyConName :: Name
constraintKindTyConName :: Name
constraintKindTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Constraint") Unique
constraintKindTyConKey TyCon
constraintKindTyCon
liftedTypeKindTyConName :: Name
liftedTypeKindTyConName :: Name
liftedTypeKindTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Type") Unique
liftedTypeKindTyConKey TyCon
liftedTypeKindTyCon
multiplicityTyConName :: Name
multiplicityTyConName :: Name
multiplicityTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Multiplicity")
Unique
multiplicityTyConKey TyCon
multiplicityTyCon
oneDataConName, manyDataConName :: Name
oneDataConName :: Name
oneDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
BuiltInSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"One") Unique
oneDataConKey DataCon
oneDataCon
manyDataConName :: Name
manyDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
BuiltInSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"Many") Unique
manyDataConKey DataCon
manyDataCon
runtimeRepTyConName, vecRepDataConName, tupleRepDataConName, sumRepDataConName :: Name
runtimeRepTyConName :: Name
runtimeRepTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"RuntimeRep") Unique
runtimeRepTyConKey TyCon
runtimeRepTyCon
vecRepDataConName :: Name
vecRepDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"VecRep") Unique
vecRepDataConKey DataCon
vecRepDataCon
tupleRepDataConName :: Name
tupleRepDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"TupleRep") Unique
tupleRepDataConKey DataCon
tupleRepDataCon
sumRepDataConName :: Name
sumRepDataConName = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"SumRep") Unique
sumRepDataConKey DataCon
sumRepDataCon
runtimeRepSimpleDataConNames :: [Name]
runtimeRepSimpleDataConNames :: [Name]
runtimeRepSimpleDataConNames
= (FastString -> Unique -> DataCon -> Name)
-> [FastString] -> [Unique] -> [DataCon] -> [Name]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3Lazy FastString -> Unique -> DataCon -> Name
mk_special_dc_name
[ [Char] -> FastString
fsLit [Char]
"LiftedRep", [Char] -> FastString
fsLit [Char]
"UnliftedRep"
, [Char] -> FastString
fsLit [Char]
"IntRep"
, [Char] -> FastString
fsLit [Char]
"Int8Rep", [Char] -> FastString
fsLit [Char]
"Int16Rep", [Char] -> FastString
fsLit [Char]
"Int32Rep", [Char] -> FastString
fsLit [Char]
"Int64Rep"
, [Char] -> FastString
fsLit [Char]
"WordRep"
, [Char] -> FastString
fsLit [Char]
"Word8Rep", [Char] -> FastString
fsLit [Char]
"Word16Rep", [Char] -> FastString
fsLit [Char]
"Word32Rep", [Char] -> FastString
fsLit [Char]
"Word64Rep"
, [Char] -> FastString
fsLit [Char]
"AddrRep"
, [Char] -> FastString
fsLit [Char]
"FloatRep", [Char] -> FastString
fsLit [Char]
"DoubleRep"
]
[Unique]
runtimeRepSimpleDataConKeys
[DataCon]
runtimeRepSimpleDataCons
vecCountTyConName :: Name
vecCountTyConName :: Name
vecCountTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"VecCount") Unique
vecCountTyConKey TyCon
vecCountTyCon
vecCountDataConNames :: [Name]
vecCountDataConNames :: [Name]
vecCountDataConNames = (FastString -> Unique -> DataCon -> Name)
-> [FastString] -> [Unique] -> [DataCon] -> [Name]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3Lazy FastString -> Unique -> DataCon -> Name
mk_special_dc_name
[ [Char] -> FastString
fsLit [Char]
"Vec2", [Char] -> FastString
fsLit [Char]
"Vec4", [Char] -> FastString
fsLit [Char]
"Vec8"
, [Char] -> FastString
fsLit [Char]
"Vec16", [Char] -> FastString
fsLit [Char]
"Vec32", [Char] -> FastString
fsLit [Char]
"Vec64" ]
[Unique]
vecCountDataConKeys
[DataCon]
vecCountDataCons
vecElemTyConName :: Name
vecElemTyConName :: Name
vecElemTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"VecElem") Unique
vecElemTyConKey TyCon
vecElemTyCon
vecElemDataConNames :: [Name]
vecElemDataConNames :: [Name]
vecElemDataConNames = (FastString -> Unique -> DataCon -> Name)
-> [FastString] -> [Unique] -> [DataCon] -> [Name]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3Lazy FastString -> Unique -> DataCon -> Name
mk_special_dc_name
[ [Char] -> FastString
fsLit [Char]
"Int8ElemRep", [Char] -> FastString
fsLit [Char]
"Int16ElemRep", [Char] -> FastString
fsLit [Char]
"Int32ElemRep"
, [Char] -> FastString
fsLit [Char]
"Int64ElemRep", [Char] -> FastString
fsLit [Char]
"Word8ElemRep", [Char] -> FastString
fsLit [Char]
"Word16ElemRep"
, [Char] -> FastString
fsLit [Char]
"Word32ElemRep", [Char] -> FastString
fsLit [Char]
"Word64ElemRep"
, [Char] -> FastString
fsLit [Char]
"FloatElemRep", [Char] -> FastString
fsLit [Char]
"DoubleElemRep" ]
[Unique]
vecElemDataConKeys
[DataCon]
vecElemDataCons
mk_special_dc_name :: FastString -> Unique -> DataCon -> Name
mk_special_dc_name :: FastString -> Unique -> DataCon -> Name
mk_special_dc_name FastString
fs Unique
u DataCon
dc = BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName BuiltInSyntax
UserSyntax Module
gHC_TYPES FastString
fs Unique
u DataCon
dc
boolTyCon_RDR, false_RDR, true_RDR, intTyCon_RDR, charTyCon_RDR, stringTyCon_RDR,
intDataCon_RDR, listTyCon_RDR, consDataCon_RDR :: RdrName
boolTyCon_RDR :: RdrName
boolTyCon_RDR = Name -> RdrName
nameRdrName Name
boolTyConName
false_RDR :: RdrName
false_RDR = Name -> RdrName
nameRdrName Name
falseDataConName
true_RDR :: RdrName
true_RDR = Name -> RdrName
nameRdrName Name
trueDataConName
intTyCon_RDR :: RdrName
intTyCon_RDR = Name -> RdrName
nameRdrName Name
intTyConName
charTyCon_RDR :: RdrName
charTyCon_RDR = Name -> RdrName
nameRdrName Name
charTyConName
stringTyCon_RDR :: RdrName
stringTyCon_RDR = Name -> RdrName
nameRdrName Name
stringTyConName
intDataCon_RDR :: RdrName
intDataCon_RDR = Name -> RdrName
nameRdrName Name
intDataConName
listTyCon_RDR :: RdrName
listTyCon_RDR = Name -> RdrName
nameRdrName Name
listTyConName
consDataCon_RDR :: RdrName
consDataCon_RDR = Name -> RdrName
nameRdrName Name
consDataConName
pcTyCon :: Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon :: Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
name Maybe CType
cType [TyVar]
tyvars [DataCon]
cons
= Name
-> [TyConBinder]
-> Type
-> [Role]
-> Maybe CType
-> [Type]
-> AlgTyConRhs
-> AlgTyConFlav
-> Bool
-> TyCon
mkAlgTyCon Name
name
(AnonArgFlag -> [TyVar] -> [TyConBinder]
mkAnonTyConBinders AnonArgFlag
VisArg [TyVar]
tyvars)
Type
liftedTypeKind
((TyVar -> Role) -> [TyVar] -> [Role]
forall a b. (a -> b) -> [a] -> [b]
map (Role -> TyVar -> Role
forall a b. a -> b -> a
const Role
Representational) [TyVar]
tyvars)
Maybe CType
cType
[]
([DataCon] -> AlgTyConRhs
mkDataTyConRhs [DataCon]
cons)
(Name -> AlgTyConFlav
VanillaAlgTyCon (Name -> Name
mkPrelTyConRepName Name
name))
Bool
False
pcDataCon :: Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon :: Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
n [TyVar]
univs [Type]
tys = Name -> [TyVar] -> [Scaled Type] -> TyCon -> DataCon
pcDataConW Name
n [TyVar]
univs ((Type -> Scaled Type) -> [Type] -> [Scaled Type]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Scaled Type
forall a. a -> Scaled a
linear [Type]
tys)
pcDataConW :: Name -> [TyVar] -> [Scaled Type] -> TyCon -> DataCon
pcDataConW :: Name -> [TyVar] -> [Scaled Type] -> TyCon -> DataCon
pcDataConW Name
n [TyVar]
univs [Scaled Type]
tys = Bool
-> Name
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity Bool
False Name
n [TyVar]
univs
[]
[TyVar]
univs
[Scaled Type]
tys
pcDataConWithFixity :: Bool
-> Name
-> [TyVar]
-> [TyCoVar]
-> [TyCoVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity :: Bool
-> Name
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity Bool
infx Name
n = Bool
-> Name
-> Unique
-> RuntimeRepInfo
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity' Bool
infx Name
n (Unique -> Unique
dataConWorkerUnique (Name -> Unique
nameUnique Name
n))
RuntimeRepInfo
NoRRI
pcDataConWithFixity' :: Bool -> Name -> Unique -> RuntimeRepInfo
-> [TyVar] -> [TyCoVar] -> [TyCoVar]
-> [Scaled Type] -> TyCon -> DataCon
pcDataConWithFixity' :: Bool
-> Name
-> Unique
-> RuntimeRepInfo
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity' Bool
declared_infix Name
dc_name Unique
wrk_key RuntimeRepInfo
rri
[TyVar]
tyvars [TyVar]
ex_tyvars [TyVar]
user_tyvars [Scaled Type]
arg_tys TyCon
tycon
= DataCon
data_con
where
tag_map :: NameEnv Arity
tag_map = TyCon -> NameEnv Arity
mkTyConTagMap TyCon
tycon
data_con :: DataCon
data_con = Name
-> Bool
-> Name
-> [HsSrcBang]
-> [FieldLabel]
-> [TyVar]
-> [TyVar]
-> [InvisTVBinder]
-> [EqSpec]
-> [Type]
-> [Scaled Type]
-> Type
-> RuntimeRepInfo
-> TyCon
-> Arity
-> [Type]
-> TyVar
-> DataConRep
-> DataCon
mkDataCon Name
dc_name Bool
declared_infix Name
prom_info
((Scaled Type -> HsSrcBang) -> [Scaled Type] -> [HsSrcBang]
forall a b. (a -> b) -> [a] -> [b]
map (HsSrcBang -> Scaled Type -> HsSrcBang
forall a b. a -> b -> a
const HsSrcBang
no_bang) [Scaled Type]
arg_tys)
[]
[TyVar]
tyvars [TyVar]
ex_tyvars
(Specificity -> [TyVar] -> [InvisTVBinder]
forall vis. vis -> [TyVar] -> [VarBndr TyVar vis]
mkTyVarBinders Specificity
SpecifiedSpec [TyVar]
user_tyvars)
[]
[]
[Scaled Type]
arg_tys (TyCon -> [Type] -> Type
mkTyConApp TyCon
tycon ([TyVar] -> [Type]
mkTyVarTys [TyVar]
tyvars))
RuntimeRepInfo
rri
TyCon
tycon
(NameEnv Arity -> Name -> Arity
forall a. NameEnv a -> Name -> a
lookupNameEnv_NF NameEnv Arity
tag_map Name
dc_name)
[]
(Name -> DataCon -> TyVar
mkDataConWorkId Name
wrk_name DataCon
data_con)
DataConRep
NoDataConRep
no_bang :: HsSrcBang
no_bang = SourceText -> SrcUnpackedness -> SrcStrictness -> HsSrcBang
HsSrcBang SourceText
NoSourceText SrcUnpackedness
NoSrcUnpack SrcStrictness
NoSrcStrict
wrk_name :: Name
wrk_name = DataCon -> Unique -> Name
mkDataConWorkerName DataCon
data_con Unique
wrk_key
prom_info :: Name
prom_info = Name -> Name
mkPrelTyConRepName Name
dc_name
mkDataConWorkerName :: DataCon -> Unique -> Name
mkDataConWorkerName :: DataCon -> Unique -> Name
mkDataConWorkerName DataCon
data_con Unique
wrk_key =
Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu OccName
wrk_occ Unique
wrk_key
(TyVar -> TyThing
AnId (DataCon -> TyVar
dataConWorkId DataCon
data_con)) BuiltInSyntax
UserSyntax
where
modu :: Module
modu = ASSERT( isExternalName dc_name )
HasDebugCallStack => Name -> Module
Name -> Module
nameModule Name
dc_name
dc_name :: Name
dc_name = DataCon -> Name
dataConName DataCon
data_con
dc_occ :: OccName
dc_occ = Name -> OccName
nameOccName Name
dc_name
wrk_occ :: OccName
wrk_occ = OccName -> OccName
mkDataConWorkerOcc OccName
dc_occ
pcSpecialDataCon :: Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon :: Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
dc_name [Type]
arg_tys TyCon
tycon RuntimeRepInfo
rri
= Bool
-> Name
-> Unique
-> RuntimeRepInfo
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity' Bool
False Name
dc_name (Unique -> Unique
dataConWorkerUnique (Name -> Unique
nameUnique Name
dc_name)) RuntimeRepInfo
rri
[] [] [] ((Type -> Scaled Type) -> [Type] -> [Scaled Type]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Scaled Type
forall a. a -> Scaled a
linear [Type]
arg_tys) TyCon
tycon
typeNatKindCon, typeSymbolKindCon :: TyCon
typeNatKindCon :: TyCon
typeNatKindCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
typeNatKindConName Maybe CType
forall a. Maybe a
Nothing [] []
typeSymbolKindCon :: TyCon
typeSymbolKindCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
typeSymbolKindConName Maybe CType
forall a. Maybe a
Nothing [] []
typeNatKind, typeSymbolKind :: Kind
typeNatKind :: Type
typeNatKind = TyCon -> Type
mkTyConTy TyCon
typeNatKindCon
typeSymbolKind :: Type
typeSymbolKind = TyCon -> Type
mkTyConTy TyCon
typeSymbolKindCon
constraintKindTyCon :: TyCon
constraintKindTyCon :: TyCon
constraintKindTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
constraintKindTyConName Maybe CType
forall a. Maybe a
Nothing [] []
liftedTypeKind, typeToTypeKind, constraintKind :: Kind
liftedTypeKind :: Type
liftedTypeKind = Type -> Type
tYPE Type
liftedRepTy
typeToTypeKind :: Type
typeToTypeKind = Type
liftedTypeKind Type -> Type -> Type
`mkVisFunTyMany` Type
liftedTypeKind
constraintKind :: Type
constraintKind = TyCon -> [Type] -> Type
mkTyConApp TyCon
constraintKindTyCon []
isBuiltInOcc_maybe :: OccName -> Maybe Name
isBuiltInOcc_maybe :: OccName -> Maybe Name
isBuiltInOcc_maybe OccName
occ =
case ByteString
name of
ByteString
"[]" -> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Name -> Name -> Name
choose_ns Name
listTyConName Name
nilDataConName
ByteString
":" -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
consDataConName
ByteString
"~" -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
eqTyConName
ByteString
"FUN" -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
funTyConName
ByteString
"->" -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
unrestrictedFunTyConName
ByteString
"()" -> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Boxity -> Arity -> Name
tup_name Boxity
Boxed Arity
0
ByteString
_ | Just ByteString
rest <- ByteString
"(" ByteString -> ByteString -> Maybe ByteString
`BS.stripPrefix` ByteString
name
, (ByteString
commas, ByteString
rest') <- (Char -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
',') ByteString
rest
, ByteString
")" <- ByteString
rest'
-> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Boxity -> Arity -> Name
tup_name Boxity
Boxed (Arity
1Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ByteString -> Arity
BS.length ByteString
commas)
ByteString
"(##)" -> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Boxity -> Arity -> Name
tup_name Boxity
Unboxed Arity
0
ByteString
"Solo#" -> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Boxity -> Arity -> Name
tup_name Boxity
Unboxed Arity
1
ByteString
_ | Just ByteString
rest <- ByteString
"(#" ByteString -> ByteString -> Maybe ByteString
`BS.stripPrefix` ByteString
name
, (ByteString
commas, ByteString
rest') <- (Char -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
',') ByteString
rest
, ByteString
"#)" <- ByteString
rest'
-> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Boxity -> Arity -> Name
tup_name Boxity
Unboxed (Arity
1Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ByteString -> Arity
BS.length ByteString
commas)
ByteString
_ | Just ByteString
rest <- ByteString
"(#" ByteString -> ByteString -> Maybe ByteString
`BS.stripPrefix` ByteString
name
, (ByteString
pipes, ByteString
rest') <- (Char -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
'|') ByteString
rest
, ByteString
"#)" <- ByteString
rest'
-> Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ TyCon -> Name
tyConName (TyCon -> Name) -> TyCon -> Name
forall a b. (a -> b) -> a -> b
$ Arity -> TyCon
sumTyCon (Arity
1Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ByteString -> Arity
BS.length ByteString
pipes)
ByteString
_ | Just ByteString
rest <- ByteString
"(#" ByteString -> ByteString -> Maybe ByteString
`BS.stripPrefix` ByteString
name
, (ByteString
pipes1, ByteString
rest') <- (Char -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
'|') ByteString
rest
, Just ByteString
rest'' <- ByteString
"_" ByteString -> ByteString -> Maybe ByteString
`BS.stripPrefix` ByteString
rest'
, (ByteString
pipes2, ByteString
rest''') <- (Char -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
'|') ByteString
rest''
, ByteString
"#)" <- ByteString
rest'''
-> let arity :: Arity
arity = ByteString -> Arity
BS.length ByteString
pipes1 Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ ByteString -> Arity
BS.length ByteString
pipes2 Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ Arity
1
alt :: Arity
alt = ByteString -> Arity
BS.length ByteString
pipes1 Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
+ Arity
1
in Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ DataCon -> Name
dataConName (DataCon -> Name) -> DataCon -> Name
forall a b. (a -> b) -> a -> b
$ Arity -> Arity -> DataCon
sumDataCon Arity
alt Arity
arity
ByteString
_ -> Maybe Name
forall a. Maybe a
Nothing
where
name :: ByteString
name = FastString -> ByteString
bytesFS (FastString -> ByteString) -> FastString -> ByteString
forall a b. (a -> b) -> a -> b
$ OccName -> FastString
occNameFS OccName
occ
choose_ns :: Name -> Name -> Name
choose_ns :: Name -> Name -> Name
choose_ns Name
tc Name
dc
| NameSpace -> Bool
isTcClsNameSpace NameSpace
ns = Name
tc
| NameSpace -> Bool
isDataConNameSpace NameSpace
ns = Name
dc
| Bool
otherwise = [Char] -> SDoc -> Name
forall a. HasCallStack => [Char] -> SDoc -> a
pprPanic [Char]
"tup_name" (OccName -> SDoc
forall a. Outputable a => a -> SDoc
ppr OccName
occ)
where ns :: NameSpace
ns = OccName -> NameSpace
occNameSpace OccName
occ
tup_name :: Boxity -> Arity -> Name
tup_name Boxity
boxity Arity
arity
= Name -> Name -> Name
choose_ns (TyCon -> Name
forall a. NamedThing a => a -> Name
getName (Boxity -> Arity -> TyCon
tupleTyCon Boxity
boxity Arity
arity))
(DataCon -> Name
forall a. NamedThing a => a -> Name
getName (Boxity -> Arity -> DataCon
tupleDataCon Boxity
boxity Arity
arity))
mkTupleOcc :: NameSpace -> Boxity -> Arity -> OccName
mkTupleOcc :: NameSpace -> Boxity -> Arity -> OccName
mkTupleOcc NameSpace
ns Boxity
Boxed Arity
ar = NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns (Arity -> [Char]
mkBoxedTupleStr Arity
ar)
mkTupleOcc NameSpace
ns Boxity
Unboxed Arity
ar = NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns (Arity -> [Char]
mkUnboxedTupleStr Arity
ar)
mkCTupleOcc :: NameSpace -> Arity -> OccName
mkCTupleOcc :: NameSpace -> Arity -> OccName
mkCTupleOcc NameSpace
ns Arity
ar = NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns (Arity -> [Char]
mkConstraintTupleStr Arity
ar)
mkTupleStr :: Boxity -> Arity -> String
mkTupleStr :: Boxity -> Arity -> [Char]
mkTupleStr Boxity
Boxed = Arity -> [Char]
mkBoxedTupleStr
mkTupleStr Boxity
Unboxed = Arity -> [Char]
mkUnboxedTupleStr
mkBoxedTupleStr :: Arity -> String
mkBoxedTupleStr :: Arity -> [Char]
mkBoxedTupleStr Arity
0 = [Char]
"()"
mkBoxedTupleStr Arity
1 = [Char]
"Solo"
mkBoxedTupleStr Arity
ar = Char
'(' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Arity -> [Char]
commas Arity
ar [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")"
mkUnboxedTupleStr :: Arity -> String
mkUnboxedTupleStr :: Arity -> [Char]
mkUnboxedTupleStr Arity
0 = [Char]
"(##)"
mkUnboxedTupleStr Arity
1 = [Char]
"Solo#"
mkUnboxedTupleStr Arity
ar = [Char]
"(#" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
commas Arity
ar [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"#)"
mkConstraintTupleStr :: Arity -> String
mkConstraintTupleStr :: Arity -> [Char]
mkConstraintTupleStr Arity
0 = [Char]
"(%%)"
mkConstraintTupleStr Arity
1 = [Char]
"Solo%"
mkConstraintTupleStr Arity
ar = [Char]
"(%" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
commas Arity
ar [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"%)"
commas :: Arity -> String
commas :: Arity -> [Char]
commas Arity
ar = Arity -> [Char] -> [Char]
forall a. Arity -> [a] -> [a]
take (Arity
arArity -> Arity -> Arity
forall a. Num a => a -> a -> a
-Arity
1) (Char -> [Char]
forall a. a -> [a]
repeat Char
',')
cTupleTyConName :: Arity -> Name
cTupleTyConName :: Arity -> Name
cTupleTyConName Arity
arity
= Unique -> Module -> OccName -> SrcSpan -> Name
mkExternalName (Arity -> Unique
mkCTupleTyConUnique Arity
arity) Module
gHC_CLASSES
(NameSpace -> Arity -> OccName
mkCTupleOcc NameSpace
tcName Arity
arity) SrcSpan
noSrcSpan
cTupleTyConNames :: [Name]
cTupleTyConNames :: [Name]
cTupleTyConNames = (Arity -> Name) -> [Arity] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Arity -> Name
cTupleTyConName (Arity
0 Arity -> [Arity] -> [Arity]
forall a. a -> [a] -> [a]
: [Arity
2..Arity
mAX_CTUPLE_SIZE])
cTupleTyConNameSet :: NameSet
cTupleTyConNameSet :: NameSet
cTupleTyConNameSet = [Name] -> NameSet
mkNameSet [Name]
cTupleTyConNames
isCTupleTyConName :: Name -> Bool
isCTupleTyConName :: Name -> Bool
isCTupleTyConName Name
n
= ASSERT2( isExternalName n, ppr n )
HasDebugCallStack => Name -> Module
Name -> Module
nameModule Name
n Module -> Module -> Bool
forall a. Eq a => a -> a -> Bool
== Module
gHC_CLASSES
Bool -> Bool -> Bool
&& Name
n Name -> NameSet -> Bool
`elemNameSet` NameSet
cTupleTyConNameSet
cTupleTyConNameArity_maybe :: Name -> Maybe Arity
cTupleTyConNameArity_maybe :: Name -> Maybe Arity
cTupleTyConNameArity_maybe Name
n
| Bool -> Bool
not (Name -> Bool
isCTupleTyConName Name
n) = Maybe Arity
forall a. Maybe a
Nothing
| Bool
otherwise = (Arity -> Arity) -> Maybe Arity -> Maybe Arity
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Arity -> Arity
forall {a}. (Ord a, Num a) => a -> a
adjustArity (Name
n Name -> [Name] -> Maybe Arity
forall a. Eq a => a -> [a] -> Maybe Arity
`elemIndex` [Name]
cTupleTyConNames)
where
adjustArity :: a -> a
adjustArity a
a = if a
a a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0 then a
a a -> a -> a
forall a. Num a => a -> a -> a
+ a
1 else a
a
cTupleDataConName :: Arity -> Name
cTupleDataConName :: Arity -> Name
cTupleDataConName Arity
arity
= Unique -> Module -> OccName -> SrcSpan -> Name
mkExternalName (Arity -> Unique
mkCTupleDataConUnique Arity
arity) Module
gHC_CLASSES
(NameSpace -> Arity -> OccName
mkCTupleOcc NameSpace
dataName Arity
arity) SrcSpan
noSrcSpan
cTupleDataConNames :: [Name]
cTupleDataConNames :: [Name]
cTupleDataConNames = (Arity -> Name) -> [Arity] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Arity -> Name
cTupleDataConName (Arity
0 Arity -> [Arity] -> [Arity]
forall a. a -> [a] -> [a]
: [Arity
2..Arity
mAX_CTUPLE_SIZE])
tupleTyCon :: Boxity -> Arity -> TyCon
tupleTyCon :: Boxity -> Arity -> TyCon
tupleTyCon Boxity
sort Arity
i | Arity
i Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
> Arity
mAX_TUPLE_SIZE = (TyCon, DataCon) -> TyCon
forall a b. (a, b) -> a
fst (Boxity -> Arity -> (TyCon, DataCon)
mk_tuple Boxity
sort Arity
i)
tupleTyCon Boxity
Boxed Arity
i = (TyCon, DataCon) -> TyCon
forall a b. (a, b) -> a
fst (Array Arity (TyCon, DataCon)
boxedTupleArr Array Arity (TyCon, DataCon) -> Arity -> (TyCon, DataCon)
forall i e. Ix i => Array i e -> i -> e
! Arity
i)
tupleTyCon Boxity
Unboxed Arity
i = (TyCon, DataCon) -> TyCon
forall a b. (a, b) -> a
fst (Array Arity (TyCon, DataCon)
unboxedTupleArr Array Arity (TyCon, DataCon) -> Arity -> (TyCon, DataCon)
forall i e. Ix i => Array i e -> i -> e
! Arity
i)
tupleTyConName :: TupleSort -> Arity -> Name
tupleTyConName :: TupleSort -> Arity -> Name
tupleTyConName TupleSort
ConstraintTuple Arity
a = Arity -> Name
cTupleTyConName Arity
a
tupleTyConName TupleSort
BoxedTuple Arity
a = TyCon -> Name
tyConName (Boxity -> Arity -> TyCon
tupleTyCon Boxity
Boxed Arity
a)
tupleTyConName TupleSort
UnboxedTuple Arity
a = TyCon -> Name
tyConName (Boxity -> Arity -> TyCon
tupleTyCon Boxity
Unboxed Arity
a)
promotedTupleDataCon :: Boxity -> Arity -> TyCon
promotedTupleDataCon :: Boxity -> Arity -> TyCon
promotedTupleDataCon Boxity
boxity Arity
i = DataCon -> TyCon
promoteDataCon (Boxity -> Arity -> DataCon
tupleDataCon Boxity
boxity Arity
i)
tupleDataCon :: Boxity -> Arity -> DataCon
tupleDataCon :: Boxity -> Arity -> DataCon
tupleDataCon Boxity
sort Arity
i | Arity
i Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
> Arity
mAX_TUPLE_SIZE = (TyCon, DataCon) -> DataCon
forall a b. (a, b) -> b
snd (Boxity -> Arity -> (TyCon, DataCon)
mk_tuple Boxity
sort Arity
i)
tupleDataCon Boxity
Boxed Arity
i = (TyCon, DataCon) -> DataCon
forall a b. (a, b) -> b
snd (Array Arity (TyCon, DataCon)
boxedTupleArr Array Arity (TyCon, DataCon) -> Arity -> (TyCon, DataCon)
forall i e. Ix i => Array i e -> i -> e
! Arity
i)
tupleDataCon Boxity
Unboxed Arity
i = (TyCon, DataCon) -> DataCon
forall a b. (a, b) -> b
snd (Array Arity (TyCon, DataCon)
unboxedTupleArr Array Arity (TyCon, DataCon) -> Arity -> (TyCon, DataCon)
forall i e. Ix i => Array i e -> i -> e
! Arity
i)
tupleDataConName :: Boxity -> Arity -> Name
tupleDataConName :: Boxity -> Arity -> Name
tupleDataConName Boxity
sort Arity
i = DataCon -> Name
dataConName (Boxity -> Arity -> DataCon
tupleDataCon Boxity
sort Arity
i)
boxedTupleArr, unboxedTupleArr :: Array Int (TyCon,DataCon)
boxedTupleArr :: Array Arity (TyCon, DataCon)
boxedTupleArr = (Arity, Arity)
-> [(TyCon, DataCon)] -> Array Arity (TyCon, DataCon)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Arity
0,Arity
mAX_TUPLE_SIZE) [Boxity -> Arity -> (TyCon, DataCon)
mk_tuple Boxity
Boxed Arity
i | Arity
i <- [Arity
0..Arity
mAX_TUPLE_SIZE]]
unboxedTupleArr :: Array Arity (TyCon, DataCon)
unboxedTupleArr = (Arity, Arity)
-> [(TyCon, DataCon)] -> Array Arity (TyCon, DataCon)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Arity
0,Arity
mAX_TUPLE_SIZE) [Boxity -> Arity -> (TyCon, DataCon)
mk_tuple Boxity
Unboxed Arity
i | Arity
i <- [Arity
0..Arity
mAX_TUPLE_SIZE]]
unboxedTupleSumKind :: TyCon -> [Type] -> Kind
unboxedTupleSumKind :: TyCon -> [Type] -> Type
unboxedTupleSumKind TyCon
tc [Type]
rr_tys
= Type -> Type
tYPE (TyCon -> [Type] -> Type
mkTyConApp TyCon
tc [Type -> [Type] -> Type
mkPromotedListTy Type
runtimeRepTy [Type]
rr_tys])
unboxedTupleKind :: [Type] -> Kind
unboxedTupleKind :: [Type] -> Type
unboxedTupleKind = TyCon -> [Type] -> Type
unboxedTupleSumKind TyCon
tupleRepDataConTyCon
mk_tuple :: Boxity -> Int -> (TyCon,DataCon)
mk_tuple :: Boxity -> Arity -> (TyCon, DataCon)
mk_tuple Boxity
Boxed Arity
arity = (TyCon
tycon, DataCon
tuple_con)
where
tycon :: TyCon
tycon = Name
-> [TyConBinder]
-> Type
-> Arity
-> DataCon
-> TupleSort
-> AlgTyConFlav
-> TyCon
mkTupleTyCon Name
tc_name [TyConBinder]
tc_binders Type
tc_res_kind Arity
tc_arity DataCon
tuple_con
TupleSort
BoxedTuple AlgTyConFlav
flavour
tc_binders :: [TyConBinder]
tc_binders = [Type] -> [TyConBinder]
mkTemplateAnonTyConBinders (Arity -> Type -> [Type]
forall a. Arity -> a -> [a]
replicate Arity
arity Type
liftedTypeKind)
tc_res_kind :: Type
tc_res_kind = Type
liftedTypeKind
tc_arity :: Arity
tc_arity = Arity
arity
flavour :: AlgTyConFlav
flavour = Name -> AlgTyConFlav
VanillaAlgTyCon (Name -> Name
mkPrelTyConRepName Name
tc_name)
dc_tvs :: [TyVar]
dc_tvs = [TyConBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TyConBinder]
tc_binders
dc_arg_tys :: [Type]
dc_arg_tys = [TyVar] -> [Type]
mkTyVarTys [TyVar]
dc_tvs
tuple_con :: DataCon
tuple_con = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
dc_name [TyVar]
dc_tvs [Type]
dc_arg_tys TyCon
tycon
boxity :: Boxity
boxity = Boxity
Boxed
modu :: Module
modu = Module
gHC_TUPLE
tc_name :: Name
tc_name = Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu (NameSpace -> Boxity -> Arity -> OccName
mkTupleOcc NameSpace
tcName Boxity
boxity Arity
arity) Unique
tc_uniq
(TyCon -> TyThing
ATyCon TyCon
tycon) BuiltInSyntax
BuiltInSyntax
dc_name :: Name
dc_name = Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu (NameSpace -> Boxity -> Arity -> OccName
mkTupleOcc NameSpace
dataName Boxity
boxity Arity
arity) Unique
dc_uniq
(ConLike -> TyThing
AConLike (DataCon -> ConLike
RealDataCon DataCon
tuple_con)) BuiltInSyntax
BuiltInSyntax
tc_uniq :: Unique
tc_uniq = Boxity -> Arity -> Unique
mkTupleTyConUnique Boxity
boxity Arity
arity
dc_uniq :: Unique
dc_uniq = Boxity -> Arity -> Unique
mkTupleDataConUnique Boxity
boxity Arity
arity
mk_tuple Boxity
Unboxed Arity
arity = (TyCon
tycon, DataCon
tuple_con)
where
tycon :: TyCon
tycon = Name
-> [TyConBinder]
-> Type
-> Arity
-> DataCon
-> TupleSort
-> AlgTyConFlav
-> TyCon
mkTupleTyCon Name
tc_name [TyConBinder]
tc_binders Type
tc_res_kind Arity
tc_arity DataCon
tuple_con
TupleSort
UnboxedTuple AlgTyConFlav
flavour
tc_binders :: [TyConBinder]
tc_binders = [Type] -> ([Type] -> [Type]) -> [TyConBinder]
mkTemplateTyConBinders (Arity -> Type -> [Type]
forall a. Arity -> a -> [a]
replicate Arity
arity Type
runtimeRepTy)
(\[Type]
ks -> (Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Type
tYPE [Type]
ks)
tc_res_kind :: Type
tc_res_kind = [Type] -> Type
unboxedTupleKind [Type]
rr_tys
tc_arity :: Arity
tc_arity = Arity
arity Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
* Arity
2
flavour :: AlgTyConFlav
flavour = Maybe Name -> AlgTyConFlav
UnboxedAlgTyCon (Maybe Name -> AlgTyConFlav) -> Maybe Name -> AlgTyConFlav
forall a b. (a -> b) -> a -> b
$ Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Name
mkPrelTyConRepName Name
tc_name)
dc_tvs :: [TyVar]
dc_tvs = [TyConBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TyConBinder]
tc_binders
([Type]
rr_tys, [Type]
dc_arg_tys) = Arity -> [Type] -> ([Type], [Type])
forall a. Arity -> [a] -> ([a], [a])
splitAt Arity
arity ([TyVar] -> [Type]
mkTyVarTys [TyVar]
dc_tvs)
tuple_con :: DataCon
tuple_con = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
dc_name [TyVar]
dc_tvs [Type]
dc_arg_tys TyCon
tycon
boxity :: Boxity
boxity = Boxity
Unboxed
modu :: Module
modu = Module
gHC_PRIM
tc_name :: Name
tc_name = Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu (NameSpace -> Boxity -> Arity -> OccName
mkTupleOcc NameSpace
tcName Boxity
boxity Arity
arity) Unique
tc_uniq
(TyCon -> TyThing
ATyCon TyCon
tycon) BuiltInSyntax
BuiltInSyntax
dc_name :: Name
dc_name = Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
modu (NameSpace -> Boxity -> Arity -> OccName
mkTupleOcc NameSpace
dataName Boxity
boxity Arity
arity) Unique
dc_uniq
(ConLike -> TyThing
AConLike (DataCon -> ConLike
RealDataCon DataCon
tuple_con)) BuiltInSyntax
BuiltInSyntax
tc_uniq :: Unique
tc_uniq = Boxity -> Arity -> Unique
mkTupleTyConUnique Boxity
boxity Arity
arity
dc_uniq :: Unique
dc_uniq = Boxity -> Arity -> Unique
mkTupleDataConUnique Boxity
boxity Arity
arity
unitTyCon :: TyCon
unitTyCon :: TyCon
unitTyCon = Boxity -> Arity -> TyCon
tupleTyCon Boxity
Boxed Arity
0
unitTyConKey :: Unique
unitTyConKey :: Unique
unitTyConKey = TyCon -> Unique
forall a. Uniquable a => a -> Unique
getUnique TyCon
unitTyCon
unitDataCon :: DataCon
unitDataCon :: DataCon
unitDataCon = [DataCon] -> DataCon
forall a. [a] -> a
head (TyCon -> [DataCon]
tyConDataCons TyCon
unitTyCon)
unitDataConId :: Id
unitDataConId :: TyVar
unitDataConId = DataCon -> TyVar
dataConWorkId DataCon
unitDataCon
pairTyCon :: TyCon
pairTyCon :: TyCon
pairTyCon = Boxity -> Arity -> TyCon
tupleTyCon Boxity
Boxed Arity
2
unboxedUnitTyCon :: TyCon
unboxedUnitTyCon :: TyCon
unboxedUnitTyCon = Boxity -> Arity -> TyCon
tupleTyCon Boxity
Unboxed Arity
0
unboxedUnitDataCon :: DataCon
unboxedUnitDataCon :: DataCon
unboxedUnitDataCon = Boxity -> Arity -> DataCon
tupleDataCon Boxity
Unboxed Arity
0
mkSumTyConOcc :: Arity -> OccName
mkSumTyConOcc :: Arity -> OccName
mkSumTyConOcc Arity
n = NameSpace -> [Char] -> OccName
mkOccName NameSpace
tcName [Char]
str
where
str :: [Char]
str = Char
'(' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Char
'#' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char]
bars [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"#)"
bars :: [Char]
bars = Arity -> Char -> [Char]
forall a. Arity -> a -> [a]
replicate (Arity
nArity -> Arity -> Arity
forall a. Num a => a -> a -> a
-Arity
1) Char
'|'
mkSumDataConOcc :: ConTag -> Arity -> OccName
mkSumDataConOcc :: Arity -> Arity -> OccName
mkSumDataConOcc Arity
alt Arity
n = NameSpace -> [Char] -> OccName
mkOccName NameSpace
dataName [Char]
str
where
str :: [Char]
str = Char
'(' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Char
'#' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Arity -> [Char]
bars Arity
alt [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Char
'_' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Arity -> [Char]
bars (Arity
n Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
alt Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
1) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"#)"
bars :: Arity -> [Char]
bars Arity
i = Arity -> Char -> [Char]
forall a. Arity -> a -> [a]
replicate Arity
i Char
'|'
sumTyCon :: Arity -> TyCon
sumTyCon :: Arity -> TyCon
sumTyCon Arity
arity
| Arity
arity Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
> Arity
mAX_SUM_SIZE
= (TyCon, Array Arity DataCon) -> TyCon
forall a b. (a, b) -> a
fst (Arity -> (TyCon, Array Arity DataCon)
mk_sum Arity
arity)
| Arity
arity Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
< Arity
2
= [Char] -> TyCon
forall a. [Char] -> a
panic ([Char]
"sumTyCon: Arity starts from 2. (arity: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
arity [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")")
| Bool
otherwise
= (TyCon, Array Arity DataCon) -> TyCon
forall a b. (a, b) -> a
fst (Array Arity (TyCon, Array Arity DataCon)
unboxedSumArr Array Arity (TyCon, Array Arity DataCon)
-> Arity -> (TyCon, Array Arity DataCon)
forall i e. Ix i => Array i e -> i -> e
! Arity
arity)
sumDataCon :: ConTag
-> Arity
-> DataCon
sumDataCon :: Arity -> Arity -> DataCon
sumDataCon Arity
alt Arity
arity
| Arity
alt Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
> Arity
arity
= [Char] -> DataCon
forall a. [Char] -> a
panic ([Char]
"sumDataCon: index out of bounds: alt: "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
alt [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" > arity " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
arity)
| Arity
alt Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
<= Arity
0
= [Char] -> DataCon
forall a. [Char] -> a
panic ([Char]
"sumDataCon: Alts start from 1. (alt: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
alt
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", arity: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
arity [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")")
| Arity
arity Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
< Arity
2
= [Char] -> DataCon
forall a. [Char] -> a
panic ([Char]
"sumDataCon: Arity starts from 2. (alt: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
alt
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", arity: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Arity -> [Char]
forall a. Show a => a -> [Char]
show Arity
arity [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")")
| Arity
arity Arity -> Arity -> Bool
forall a. Ord a => a -> a -> Bool
> Arity
mAX_SUM_SIZE
= (TyCon, Array Arity DataCon) -> Array Arity DataCon
forall a b. (a, b) -> b
snd (Arity -> (TyCon, Array Arity DataCon)
mk_sum Arity
arity) Array Arity DataCon -> Arity -> DataCon
forall i e. Ix i => Array i e -> i -> e
! (Arity
alt Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
1)
| Bool
otherwise
= (TyCon, Array Arity DataCon) -> Array Arity DataCon
forall a b. (a, b) -> b
snd (Array Arity (TyCon, Array Arity DataCon)
unboxedSumArr Array Arity (TyCon, Array Arity DataCon)
-> Arity -> (TyCon, Array Arity DataCon)
forall i e. Ix i => Array i e -> i -> e
! Arity
arity) Array Arity DataCon -> Arity -> DataCon
forall i e. Ix i => Array i e -> i -> e
! (Arity
alt Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
- Arity
1)
unboxedSumArr :: Array Int (TyCon, Array Int DataCon)
unboxedSumArr :: Array Arity (TyCon, Array Arity DataCon)
unboxedSumArr = (Arity, Arity)
-> [(TyCon, Array Arity DataCon)]
-> Array Arity (TyCon, Array Arity DataCon)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Arity
2,Arity
mAX_SUM_SIZE) [Arity -> (TyCon, Array Arity DataCon)
mk_sum Arity
i | Arity
i <- [Arity
2..Arity
mAX_SUM_SIZE]]
unboxedSumKind :: [Type] -> Kind
unboxedSumKind :: [Type] -> Type
unboxedSumKind = TyCon -> [Type] -> Type
unboxedTupleSumKind TyCon
sumRepDataConTyCon
mk_sum :: Arity -> (TyCon, Array ConTagZ DataCon)
mk_sum :: Arity -> (TyCon, Array Arity DataCon)
mk_sum Arity
arity = (TyCon
tycon, Array Arity DataCon
sum_cons)
where
tycon :: TyCon
tycon = Name
-> [TyConBinder]
-> Type
-> Arity
-> [TyVar]
-> [DataCon]
-> AlgTyConFlav
-> TyCon
mkSumTyCon Name
tc_name [TyConBinder]
tc_binders Type
tc_res_kind (Arity
arity Arity -> Arity -> Arity
forall a. Num a => a -> a -> a
* Arity
2) [TyVar]
tyvars (Array Arity DataCon -> [DataCon]
forall i e. Array i e -> [e]
elems Array Arity DataCon
sum_cons)
(Maybe Name -> AlgTyConFlav
UnboxedAlgTyCon Maybe Name
forall a. Maybe a
rep_name)
rep_name :: Maybe a
rep_name = Maybe a
forall a. Maybe a
Nothing
tc_binders :: [TyConBinder]
tc_binders = [Type] -> ([Type] -> [Type]) -> [TyConBinder]
mkTemplateTyConBinders (Arity -> Type -> [Type]
forall a. Arity -> a -> [a]
replicate Arity
arity Type
runtimeRepTy)
(\[Type]
ks -> (Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Type
tYPE [Type]
ks)
tyvars :: [TyVar]
tyvars = [TyConBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TyConBinder]
tc_binders
tc_res_kind :: Type
tc_res_kind = [Type] -> Type
unboxedSumKind [Type]
rr_tys
([Type]
rr_tys, [Type]
tyvar_tys) = Arity -> [Type] -> ([Type], [Type])
forall a. Arity -> [a] -> ([a], [a])
splitAt Arity
arity ([TyVar] -> [Type]
mkTyVarTys [TyVar]
tyvars)
tc_name :: Name
tc_name = Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
gHC_PRIM (Arity -> OccName
mkSumTyConOcc Arity
arity) Unique
tc_uniq
(TyCon -> TyThing
ATyCon TyCon
tycon) BuiltInSyntax
BuiltInSyntax
sum_cons :: Array Arity DataCon
sum_cons = (Arity, Arity) -> [DataCon] -> Array Arity DataCon
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Arity
0,Arity
arityArity -> Arity -> Arity
forall a. Num a => a -> a -> a
-Arity
1) [Arity -> DataCon
sum_con Arity
i | Arity
i <- [Arity
0..Arity
arityArity -> Arity -> Arity
forall a. Num a => a -> a -> a
-Arity
1]]
sum_con :: Arity -> DataCon
sum_con Arity
i = let dc :: DataCon
dc = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
dc_name
[TyVar]
tyvars
[[Type]
tyvar_tys [Type] -> Arity -> Type
forall a. [a] -> Arity -> a
!! Arity
i]
TyCon
tycon
dc_name :: Name
dc_name = Module -> OccName -> Unique -> TyThing -> BuiltInSyntax -> Name
mkWiredInName Module
gHC_PRIM
(Arity -> Arity -> OccName
mkSumDataConOcc Arity
i Arity
arity)
(Arity -> Unique
dc_uniq Arity
i)
(ConLike -> TyThing
AConLike (DataCon -> ConLike
RealDataCon DataCon
dc))
BuiltInSyntax
BuiltInSyntax
in DataCon
dc
tc_uniq :: Unique
tc_uniq = Arity -> Unique
mkSumTyConUnique Arity
arity
dc_uniq :: Arity -> Unique
dc_uniq Arity
i = Arity -> Arity -> Unique
mkSumDataConUnique Arity
i Arity
arity
eqTyCon, heqTyCon, coercibleTyCon :: TyCon
eqClass, heqClass, coercibleClass :: Class
eqDataCon, heqDataCon, coercibleDataCon :: DataCon
eqSCSelId, heqSCSelId, coercibleSCSelId :: Id
(TyCon
eqTyCon, Class
eqClass, DataCon
eqDataCon, TyVar
eqSCSelId)
= (TyCon
tycon, Class
klass, DataCon
datacon, TyVar
sc_sel_id)
where
tycon :: TyCon
tycon = Name
-> [TyConBinder] -> [Role] -> AlgTyConRhs -> Class -> Name -> TyCon
mkClassTyCon Name
eqTyConName [TyConBinder]
binders [Role]
roles
AlgTyConRhs
rhs Class
klass
(Name -> Name
mkPrelTyConRepName Name
eqTyConName)
klass :: Class
klass = TyCon -> Type -> TyVar -> Class
mk_class TyCon
tycon Type
sc_pred TyVar
sc_sel_id
datacon :: DataCon
datacon = Name -> [TyVar] -> [Scaled Type] -> TyCon -> DataCon
pcDataConW Name
eqDataConName [TyVar]
tvs [Type -> Scaled Type
forall a. a -> Scaled a
unrestricted Type
sc_pred] TyCon
tycon
binders :: [TyConBinder]
binders = [Type] -> ([Type] -> [Type]) -> [TyConBinder]
mkTemplateTyConBinders [Type
liftedTypeKind] (\[Type
k] -> [Type
k,Type
k])
roles :: [Role]
roles = [Role
Nominal, Role
Nominal, Role
Nominal]
rhs :: AlgTyConRhs
rhs = [DataCon] -> AlgTyConRhs
mkDataTyConRhs [DataCon
datacon]
tvs :: [TyVar]
tvs@[TyVar
k,TyVar
a,TyVar
b] = [TyConBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TyConBinder]
binders
sc_pred :: Type
sc_pred = TyCon -> [Type] -> Type
mkTyConApp TyCon
eqPrimTyCon ([TyVar] -> [Type]
mkTyVarTys [TyVar
k,TyVar
k,TyVar
a,TyVar
b])
sc_sel_id :: TyVar
sc_sel_id = Name -> Class -> TyVar
mkDictSelId Name
eqSCSelIdName Class
klass
(TyCon
heqTyCon, Class
heqClass, DataCon
heqDataCon, TyVar
heqSCSelId)
= (TyCon
tycon, Class
klass, DataCon
datacon, TyVar
sc_sel_id)
where
tycon :: TyCon
tycon = Name
-> [TyConBinder] -> [Role] -> AlgTyConRhs -> Class -> Name -> TyCon
mkClassTyCon Name
heqTyConName [TyConBinder]
binders [Role]
roles
AlgTyConRhs
rhs Class
klass
(Name -> Name
mkPrelTyConRepName Name
heqTyConName)
klass :: Class
klass = TyCon -> Type -> TyVar -> Class
mk_class TyCon
tycon Type
sc_pred TyVar
sc_sel_id
datacon :: DataCon
datacon = Name -> [TyVar] -> [Scaled Type] -> TyCon -> DataCon
pcDataConW Name
heqDataConName [TyVar]
tvs [Type -> Scaled Type
forall a. a -> Scaled a
unrestricted Type
sc_pred] TyCon
tycon
binders :: [TyConBinder]
binders = [Type] -> ([Type] -> [Type]) -> [TyConBinder]
mkTemplateTyConBinders [Type
liftedTypeKind, Type
liftedTypeKind] [Type] -> [Type]
forall a. a -> a
id
roles :: [Role]
roles = [Role
Nominal, Role
Nominal, Role
Nominal, Role
Nominal]
rhs :: AlgTyConRhs
rhs = [DataCon] -> AlgTyConRhs
mkDataTyConRhs [DataCon
datacon]
tvs :: [TyVar]
tvs = [TyConBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TyConBinder]
binders
sc_pred :: Type
sc_pred = TyCon -> [Type] -> Type
mkTyConApp TyCon
eqPrimTyCon ([TyVar] -> [Type]
mkTyVarTys [TyVar]
tvs)
sc_sel_id :: TyVar
sc_sel_id = Name -> Class -> TyVar
mkDictSelId Name
heqSCSelIdName Class
klass
(TyCon
coercibleTyCon, Class
coercibleClass, DataCon
coercibleDataCon, TyVar
coercibleSCSelId)
= (TyCon
tycon, Class
klass, DataCon
datacon, TyVar
sc_sel_id)
where
tycon :: TyCon
tycon = Name
-> [TyConBinder] -> [Role] -> AlgTyConRhs -> Class -> Name -> TyCon
mkClassTyCon Name
coercibleTyConName [TyConBinder]
binders [Role]
roles
AlgTyConRhs
rhs Class
klass
(Name -> Name
mkPrelTyConRepName Name
coercibleTyConName)
klass :: Class
klass = TyCon -> Type -> TyVar -> Class
mk_class TyCon
tycon Type
sc_pred TyVar
sc_sel_id
datacon :: DataCon
datacon = Name -> [TyVar] -> [Scaled Type] -> TyCon -> DataCon
pcDataConW Name
coercibleDataConName [TyVar]
tvs [Type -> Scaled Type
forall a. a -> Scaled a
unrestricted Type
sc_pred] TyCon
tycon
binders :: [TyConBinder]
binders = [Type] -> ([Type] -> [Type]) -> [TyConBinder]
mkTemplateTyConBinders [Type
liftedTypeKind] (\[Type
k] -> [Type
k,Type
k])
roles :: [Role]
roles = [Role
Nominal, Role
Representational, Role
Representational]
rhs :: AlgTyConRhs
rhs = [DataCon] -> AlgTyConRhs
mkDataTyConRhs [DataCon
datacon]
tvs :: [TyVar]
tvs@[TyVar
k,TyVar
a,TyVar
b] = [TyConBinder] -> [TyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars [TyConBinder]
binders
sc_pred :: Type
sc_pred = TyCon -> [Type] -> Type
mkTyConApp TyCon
eqReprPrimTyCon ([TyVar] -> [Type]
mkTyVarTys [TyVar
k, TyVar
k, TyVar
a, TyVar
b])
sc_sel_id :: TyVar
sc_sel_id = Name -> Class -> TyVar
mkDictSelId Name
coercibleSCSelIdName Class
klass
mk_class :: TyCon -> PredType -> Id -> Class
mk_class :: TyCon -> Type -> TyVar -> Class
mk_class TyCon
tycon Type
sc_pred TyVar
sc_sel_id
= Name
-> [TyVar]
-> [FunDep TyVar]
-> [Type]
-> [TyVar]
-> [ClassATItem]
-> [ClassOpItem]
-> ClassMinimalDef
-> TyCon
-> Class
mkClass (TyCon -> Name
tyConName TyCon
tycon) (TyCon -> [TyVar]
tyConTyVars TyCon
tycon) [] [Type
sc_pred] [TyVar
sc_sel_id]
[] [] ([LBooleanFormula Name] -> ClassMinimalDef
forall a. Eq a => [LBooleanFormula a] -> BooleanFormula a
mkAnd []) TyCon
tycon
multiplicityTy :: Type
multiplicityTy :: Type
multiplicityTy = TyCon -> Type
mkTyConTy TyCon
multiplicityTyCon
multiplicityTyCon :: TyCon
multiplicityTyCon :: TyCon
multiplicityTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
multiplicityTyConName Maybe CType
forall a. Maybe a
Nothing []
[DataCon
oneDataCon, DataCon
manyDataCon]
oneDataCon, manyDataCon :: DataCon
oneDataCon :: DataCon
oneDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
oneDataConName [] [] TyCon
multiplicityTyCon
manyDataCon :: DataCon
manyDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
manyDataConName [] [] TyCon
multiplicityTyCon
oneDataConTy, manyDataConTy :: Type
oneDataConTy :: Type
oneDataConTy = TyCon -> Type
mkTyConTy TyCon
oneDataConTyCon
manyDataConTy :: Type
manyDataConTy = TyCon -> Type
mkTyConTy TyCon
manyDataConTyCon
oneDataConTyCon, manyDataConTyCon :: TyCon
oneDataConTyCon :: TyCon
oneDataConTyCon = DataCon -> TyCon
promoteDataCon DataCon
oneDataCon
manyDataConTyCon :: TyCon
manyDataConTyCon = DataCon -> TyCon
promoteDataCon DataCon
manyDataCon
multMulTyConName :: Name
multMulTyConName :: Name
multMulTyConName =
BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
UserSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"MultMul") Unique
multMulTyConKey TyCon
multMulTyCon
multMulTyCon :: TyCon
multMulTyCon :: TyCon
multMulTyCon = Name
-> [TyConBinder]
-> Type
-> Maybe Name
-> FamTyConFlav
-> Maybe Class
-> Injectivity
-> TyCon
mkFamilyTyCon Name
multMulTyConName [TyConBinder]
binders Type
multiplicityTy Maybe Name
forall a. Maybe a
Nothing
(BuiltInSynFamily -> FamTyConFlav
BuiltInSynFamTyCon BuiltInSynFamily
trivialBuiltInFamily)
Maybe Class
forall a. Maybe a
Nothing
Injectivity
NotInjective
where
binders :: [TyConBinder]
binders = [Type] -> [TyConBinder]
mkTemplateAnonTyConBinders [Type
multiplicityTy, Type
multiplicityTy]
unrestrictedFunTy :: Type
unrestrictedFunTy :: Type
unrestrictedFunTy = Type -> Type
functionWithMultiplicity Type
manyDataConTy
unrestrictedFunTyCon :: TyCon
unrestrictedFunTyCon :: TyCon
unrestrictedFunTyCon = Name -> [TyConBinder] -> Type -> [Role] -> Type -> TyCon
buildSynTyCon Name
unrestrictedFunTyConName [] Type
arrowKind [] Type
unrestrictedFunTy
where arrowKind :: Type
arrowKind = [TyConBinder] -> Type -> Type
mkTyConKind [TyConBinder]
binders Type
liftedTypeKind
binders :: [TyConBinder]
binders = [ TyVar -> TyConBndrVis -> TyConBinder
forall var argf. var -> argf -> VarBndr var argf
Bndr TyVar
runtimeRep1TyVar (ArgFlag -> TyConBndrVis
NamedTCB ArgFlag
Inferred)
, TyVar -> TyConBndrVis -> TyConBinder
forall var argf. var -> argf -> VarBndr var argf
Bndr TyVar
runtimeRep2TyVar (ArgFlag -> TyConBndrVis
NamedTCB ArgFlag
Inferred)
]
[TyConBinder] -> [TyConBinder] -> [TyConBinder]
forall a. [a] -> [a] -> [a]
++ [Type] -> [TyConBinder]
mkTemplateAnonTyConBinders [ Type -> Type
tYPE Type
runtimeRep1Ty
, Type -> Type
tYPE Type
runtimeRep2Ty
]
unrestrictedFunTyConName :: Name
unrestrictedFunTyConName :: Name
unrestrictedFunTyConName = BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName BuiltInSyntax
BuiltInSyntax Module
gHC_TYPES ([Char] -> FastString
fsLit [Char]
"->") Unique
unrestrictedFunTyConKey TyCon
unrestrictedFunTyCon
runtimeRepTy :: Type
runtimeRepTy :: Type
runtimeRepTy = TyCon -> Type
mkTyConTy TyCon
runtimeRepTyCon
liftedTypeKindTyCon :: TyCon
liftedTypeKindTyCon :: TyCon
liftedTypeKindTyCon = Name -> [TyConBinder] -> Type -> [Role] -> Type -> TyCon
buildSynTyCon Name
liftedTypeKindTyConName
[] Type
liftedTypeKind []
(Type -> Type
tYPE Type
liftedRepTy)
runtimeRepTyCon :: TyCon
runtimeRepTyCon :: TyCon
runtimeRepTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
runtimeRepTyConName Maybe CType
forall a. Maybe a
Nothing []
(DataCon
vecRepDataCon DataCon -> [DataCon] -> [DataCon]
forall a. a -> [a] -> [a]
: DataCon
tupleRepDataCon DataCon -> [DataCon] -> [DataCon]
forall a. a -> [a] -> [a]
:
DataCon
sumRepDataCon DataCon -> [DataCon] -> [DataCon]
forall a. a -> [a] -> [a]
: [DataCon]
runtimeRepSimpleDataCons)
vecRepDataCon :: DataCon
vecRepDataCon :: DataCon
vecRepDataCon = Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
vecRepDataConName [ TyCon -> Type
mkTyConTy TyCon
vecCountTyCon
, TyCon -> Type
mkTyConTy TyCon
vecElemTyCon ]
TyCon
runtimeRepTyCon
(([Type] -> [PrimRep]) -> RuntimeRepInfo
RuntimeRep [Type] -> [PrimRep]
prim_rep_fun)
where
prim_rep_fun :: [Type] -> [PrimRep]
prim_rep_fun [Type
count, Type
elem]
| VecCount Arity
n <- TyCon -> RuntimeRepInfo
tyConRuntimeRepInfo (Type -> TyCon
tyConAppTyCon Type
count)
, VecElem PrimElemRep
e <- TyCon -> RuntimeRepInfo
tyConRuntimeRepInfo (Type -> TyCon
tyConAppTyCon Type
elem)
= [Arity -> PrimElemRep -> PrimRep
VecRep Arity
n PrimElemRep
e]
prim_rep_fun [Type]
args
= [Char] -> SDoc -> [PrimRep]
forall a. HasCallStack => [Char] -> SDoc -> a
pprPanic [Char]
"vecRepDataCon" ([Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
args)
vecRepDataConTyCon :: TyCon
vecRepDataConTyCon :: TyCon
vecRepDataConTyCon = DataCon -> TyCon
promoteDataCon DataCon
vecRepDataCon
tupleRepDataCon :: DataCon
tupleRepDataCon :: DataCon
tupleRepDataCon = Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
tupleRepDataConName [ Type -> Type
mkListTy Type
runtimeRepTy ]
TyCon
runtimeRepTyCon (([Type] -> [PrimRep]) -> RuntimeRepInfo
RuntimeRep [Type] -> [PrimRep]
prim_rep_fun)
where
prim_rep_fun :: [Type] -> [PrimRep]
prim_rep_fun [Type
rr_ty_list]
= (Type -> [PrimRep]) -> [Type] -> [PrimRep]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (HasDebugCallStack => SDoc -> Type -> [PrimRep]
SDoc -> Type -> [PrimRep]
runtimeRepPrimRep SDoc
doc) [Type]
rr_tys
where
rr_tys :: [Type]
rr_tys = Type -> [Type]
extractPromotedList Type
rr_ty_list
doc :: SDoc
doc = [Char] -> SDoc
text [Char]
"tupleRepDataCon" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
rr_tys
prim_rep_fun [Type]
args
= [Char] -> SDoc -> [PrimRep]
forall a. HasCallStack => [Char] -> SDoc -> a
pprPanic [Char]
"tupleRepDataCon" ([Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
args)
tupleRepDataConTyCon :: TyCon
tupleRepDataConTyCon :: TyCon
tupleRepDataConTyCon = DataCon -> TyCon
promoteDataCon DataCon
tupleRepDataCon
sumRepDataCon :: DataCon
sumRepDataCon :: DataCon
sumRepDataCon = Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
sumRepDataConName [ Type -> Type
mkListTy Type
runtimeRepTy ]
TyCon
runtimeRepTyCon (([Type] -> [PrimRep]) -> RuntimeRepInfo
RuntimeRep [Type] -> [PrimRep]
prim_rep_fun)
where
prim_rep_fun :: [Type] -> [PrimRep]
prim_rep_fun [Type
rr_ty_list]
= (SlotTy -> PrimRep) -> [SlotTy] -> [PrimRep]
forall a b. (a -> b) -> [a] -> [b]
map SlotTy -> PrimRep
slotPrimRep ([[PrimRep]] -> [SlotTy]
ubxSumRepType [[PrimRep]]
prim_repss)
where
rr_tys :: [Type]
rr_tys = Type -> [Type]
extractPromotedList Type
rr_ty_list
doc :: SDoc
doc = [Char] -> SDoc
text [Char]
"sumRepDataCon" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
rr_tys
prim_repss :: [[PrimRep]]
prim_repss = (Type -> [PrimRep]) -> [Type] -> [[PrimRep]]
forall a b. (a -> b) -> [a] -> [b]
map (HasDebugCallStack => SDoc -> Type -> [PrimRep]
SDoc -> Type -> [PrimRep]
runtimeRepPrimRep SDoc
doc) [Type]
rr_tys
prim_rep_fun [Type]
args
= [Char] -> SDoc -> [PrimRep]
forall a. HasCallStack => [Char] -> SDoc -> a
pprPanic [Char]
"sumRepDataCon" ([Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
args)
sumRepDataConTyCon :: TyCon
sumRepDataConTyCon :: TyCon
sumRepDataConTyCon = DataCon -> TyCon
promoteDataCon DataCon
sumRepDataCon
runtimeRepSimpleDataCons :: [DataCon]
liftedRepDataCon :: DataCon
runtimeRepSimpleDataCons :: [DataCon]
runtimeRepSimpleDataCons@(DataCon
liftedRepDataCon : [DataCon]
_)
= (PrimRep -> Name -> DataCon) -> [PrimRep] -> [Name] -> [DataCon]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWithLazy PrimRep -> Name -> DataCon
mk_runtime_rep_dc
[ PrimRep
LiftedRep, PrimRep
UnliftedRep
, PrimRep
IntRep
, PrimRep
Int8Rep, PrimRep
Int16Rep, PrimRep
Int32Rep, PrimRep
Int64Rep
, PrimRep
WordRep
, PrimRep
Word8Rep, PrimRep
Word16Rep, PrimRep
Word32Rep, PrimRep
Word64Rep
, PrimRep
AddrRep
, PrimRep
FloatRep, PrimRep
DoubleRep
]
[Name]
runtimeRepSimpleDataConNames
where
mk_runtime_rep_dc :: PrimRep -> Name -> DataCon
mk_runtime_rep_dc PrimRep
primrep Name
name
= Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
name [] TyCon
runtimeRepTyCon (([Type] -> [PrimRep]) -> RuntimeRepInfo
RuntimeRep (\[Type]
_ -> [PrimRep
primrep]))
liftedRepDataConTy, unliftedRepDataConTy,
intRepDataConTy,
int8RepDataConTy, int16RepDataConTy, int32RepDataConTy, int64RepDataConTy,
wordRepDataConTy,
word8RepDataConTy, word16RepDataConTy, word32RepDataConTy, word64RepDataConTy,
addrRepDataConTy,
floatRepDataConTy, doubleRepDataConTy :: Type
[Type
liftedRepDataConTy, Type
unliftedRepDataConTy,
Type
intRepDataConTy,
Type
int8RepDataConTy, Type
int16RepDataConTy, Type
int32RepDataConTy, Type
int64RepDataConTy,
Type
wordRepDataConTy,
Type
word8RepDataConTy, Type
word16RepDataConTy, Type
word32RepDataConTy, Type
word64RepDataConTy,
Type
addrRepDataConTy,
Type
floatRepDataConTy, Type
doubleRepDataConTy
]
= (DataCon -> Type) -> [DataCon] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (TyCon -> Type
mkTyConTy (TyCon -> Type) -> (DataCon -> TyCon) -> DataCon -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataCon -> TyCon
promoteDataCon) [DataCon]
runtimeRepSimpleDataCons
vecCountTyCon :: TyCon
vecCountTyCon :: TyCon
vecCountTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
vecCountTyConName Maybe CType
forall a. Maybe a
Nothing [] [DataCon]
vecCountDataCons
vecCountDataCons :: [DataCon]
vecCountDataCons :: [DataCon]
vecCountDataCons = (Arity -> Name -> DataCon) -> [Arity] -> [Name] -> [DataCon]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWithLazy Arity -> Name -> DataCon
mk_vec_count_dc
[ Arity
2, Arity
4, Arity
8, Arity
16, Arity
32, Arity
64 ]
[Name]
vecCountDataConNames
where
mk_vec_count_dc :: Arity -> Name -> DataCon
mk_vec_count_dc Arity
n Name
name
= Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
name [] TyCon
vecCountTyCon (Arity -> RuntimeRepInfo
VecCount Arity
n)
vec2DataConTy, vec4DataConTy, vec8DataConTy, vec16DataConTy, vec32DataConTy,
vec64DataConTy :: Type
[Type
vec2DataConTy, Type
vec4DataConTy, Type
vec8DataConTy, Type
vec16DataConTy, Type
vec32DataConTy,
Type
vec64DataConTy] = (DataCon -> Type) -> [DataCon] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (TyCon -> Type
mkTyConTy (TyCon -> Type) -> (DataCon -> TyCon) -> DataCon -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataCon -> TyCon
promoteDataCon) [DataCon]
vecCountDataCons
vecElemTyCon :: TyCon
vecElemTyCon :: TyCon
vecElemTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
vecElemTyConName Maybe CType
forall a. Maybe a
Nothing [] [DataCon]
vecElemDataCons
vecElemDataCons :: [DataCon]
vecElemDataCons :: [DataCon]
vecElemDataCons = (PrimElemRep -> Name -> DataCon)
-> [PrimElemRep] -> [Name] -> [DataCon]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWithLazy PrimElemRep -> Name -> DataCon
mk_vec_elem_dc
[ PrimElemRep
Int8ElemRep, PrimElemRep
Int16ElemRep, PrimElemRep
Int32ElemRep, PrimElemRep
Int64ElemRep
, PrimElemRep
Word8ElemRep, PrimElemRep
Word16ElemRep, PrimElemRep
Word32ElemRep, PrimElemRep
Word64ElemRep
, PrimElemRep
FloatElemRep, PrimElemRep
DoubleElemRep ]
[Name]
vecElemDataConNames
where
mk_vec_elem_dc :: PrimElemRep -> Name -> DataCon
mk_vec_elem_dc PrimElemRep
elem Name
name
= Name -> [Type] -> TyCon -> RuntimeRepInfo -> DataCon
pcSpecialDataCon Name
name [] TyCon
vecElemTyCon (PrimElemRep -> RuntimeRepInfo
VecElem PrimElemRep
elem)
int8ElemRepDataConTy, int16ElemRepDataConTy, int32ElemRepDataConTy,
int64ElemRepDataConTy, word8ElemRepDataConTy, word16ElemRepDataConTy,
word32ElemRepDataConTy, word64ElemRepDataConTy, floatElemRepDataConTy,
doubleElemRepDataConTy :: Type
[Type
int8ElemRepDataConTy, Type
int16ElemRepDataConTy, Type
int32ElemRepDataConTy,
Type
int64ElemRepDataConTy, Type
word8ElemRepDataConTy, Type
word16ElemRepDataConTy,
Type
word32ElemRepDataConTy, Type
word64ElemRepDataConTy, Type
floatElemRepDataConTy,
Type
doubleElemRepDataConTy] = (DataCon -> Type) -> [DataCon] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (TyCon -> Type
mkTyConTy (TyCon -> Type) -> (DataCon -> TyCon) -> DataCon -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataCon -> TyCon
promoteDataCon)
[DataCon]
vecElemDataCons
liftedRepDataConTyCon :: TyCon
liftedRepDataConTyCon :: TyCon
liftedRepDataConTyCon = DataCon -> TyCon
promoteDataCon DataCon
liftedRepDataCon
liftedRepTy :: Type
liftedRepTy :: Type
liftedRepTy = Type
liftedRepDataConTy
boxingDataCon_maybe :: TyCon -> Maybe DataCon
boxingDataCon_maybe :: TyCon -> Maybe DataCon
boxingDataCon_maybe TyCon
tc
= NameEnv DataCon -> Name -> Maybe DataCon
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv NameEnv DataCon
boxing_constr_env (TyCon -> Name
tyConName TyCon
tc)
boxing_constr_env :: NameEnv DataCon
boxing_constr_env :: NameEnv DataCon
boxing_constr_env
= [(Name, DataCon)] -> NameEnv DataCon
forall a. [(Name, a)] -> NameEnv a
mkNameEnv [(Name
charPrimTyConName , DataCon
charDataCon )
,(Name
intPrimTyConName , DataCon
intDataCon )
,(Name
wordPrimTyConName , DataCon
wordDataCon )
,(Name
floatPrimTyConName , DataCon
floatDataCon )
,(Name
doublePrimTyConName, DataCon
doubleDataCon) ]
charTy :: Type
charTy :: Type
charTy = TyCon -> Type
mkTyConTy TyCon
charTyCon
charTyCon :: TyCon
charTyCon :: TyCon
charTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
charTyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing
(SourceText
NoSourceText,[Char] -> FastString
fsLit [Char]
"HsChar")))
[] [DataCon
charDataCon]
charDataCon :: DataCon
charDataCon :: DataCon
charDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
charDataConName [] [Type
charPrimTy] TyCon
charTyCon
stringTy :: Type
stringTy :: Type
stringTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
stringTyCon []
stringTyCon :: TyCon
stringTyCon :: TyCon
stringTyCon = Name -> [TyConBinder] -> Type -> [Role] -> Type -> TyCon
buildSynTyCon Name
stringTyConName
[] Type
liftedTypeKind []
(Type -> Type
mkListTy Type
charTy)
intTy :: Type
intTy :: Type
intTy = TyCon -> Type
mkTyConTy TyCon
intTyCon
intTyCon :: TyCon
intTyCon :: TyCon
intTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
intTyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing (SourceText
NoSourceText,[Char] -> FastString
fsLit [Char]
"HsInt")))
[] [DataCon
intDataCon]
intDataCon :: DataCon
intDataCon :: DataCon
intDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
intDataConName [] [Type
intPrimTy] TyCon
intTyCon
wordTy :: Type
wordTy :: Type
wordTy = TyCon -> Type
mkTyConTy TyCon
wordTyCon
wordTyCon :: TyCon
wordTyCon :: TyCon
wordTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
wordTyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing (SourceText
NoSourceText, [Char] -> FastString
fsLit [Char]
"HsWord")))
[] [DataCon
wordDataCon]
wordDataCon :: DataCon
wordDataCon :: DataCon
wordDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
wordDataConName [] [Type
wordPrimTy] TyCon
wordTyCon
word8Ty :: Type
word8Ty :: Type
word8Ty = TyCon -> Type
mkTyConTy TyCon
word8TyCon
word8TyCon :: TyCon
word8TyCon :: TyCon
word8TyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
word8TyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing
(SourceText
NoSourceText, [Char] -> FastString
fsLit [Char]
"HsWord8"))) []
[DataCon
word8DataCon]
word8DataCon :: DataCon
word8DataCon :: DataCon
word8DataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
word8DataConName [] [Type
wordPrimTy] TyCon
word8TyCon
floatTy :: Type
floatTy :: Type
floatTy = TyCon -> Type
mkTyConTy TyCon
floatTyCon
floatTyCon :: TyCon
floatTyCon :: TyCon
floatTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
floatTyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing
(SourceText
NoSourceText, [Char] -> FastString
fsLit [Char]
"HsFloat"))) []
[DataCon
floatDataCon]
floatDataCon :: DataCon
floatDataCon :: DataCon
floatDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
floatDataConName [] [Type
floatPrimTy] TyCon
floatTyCon
doubleTy :: Type
doubleTy :: Type
doubleTy = TyCon -> Type
mkTyConTy TyCon
doubleTyCon
doubleTyCon :: TyCon
doubleTyCon :: TyCon
doubleTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
doubleTyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing
(SourceText
NoSourceText,[Char] -> FastString
fsLit [Char]
"HsDouble"))) []
[DataCon
doubleDataCon]
doubleDataCon :: DataCon
doubleDataCon :: DataCon
doubleDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
doubleDataConName [] [Type
doublePrimTy] TyCon
doubleTyCon
boolTy :: Type
boolTy :: Type
boolTy = TyCon -> Type
mkTyConTy TyCon
boolTyCon
boolTyCon :: TyCon
boolTyCon :: TyCon
boolTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
boolTyConName
(CType -> Maybe CType
forall a. a -> Maybe a
Just (SourceText -> Maybe Header -> (SourceText, FastString) -> CType
CType SourceText
NoSourceText Maybe Header
forall a. Maybe a
Nothing
(SourceText
NoSourceText, [Char] -> FastString
fsLit [Char]
"HsBool")))
[] [DataCon
falseDataCon, DataCon
trueDataCon]
falseDataCon, trueDataCon :: DataCon
falseDataCon :: DataCon
falseDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
falseDataConName [] [] TyCon
boolTyCon
trueDataCon :: DataCon
trueDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
trueDataConName [] [] TyCon
boolTyCon
falseDataConId, trueDataConId :: Id
falseDataConId :: TyVar
falseDataConId = DataCon -> TyVar
dataConWorkId DataCon
falseDataCon
trueDataConId :: TyVar
trueDataConId = DataCon -> TyVar
dataConWorkId DataCon
trueDataCon
orderingTyCon :: TyCon
orderingTyCon :: TyCon
orderingTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
orderingTyConName Maybe CType
forall a. Maybe a
Nothing
[] [DataCon
ordLTDataCon, DataCon
ordEQDataCon, DataCon
ordGTDataCon]
ordLTDataCon, ordEQDataCon, ordGTDataCon :: DataCon
ordLTDataCon :: DataCon
ordLTDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
ordLTDataConName [] [] TyCon
orderingTyCon
ordEQDataCon :: DataCon
ordEQDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
ordEQDataConName [] [] TyCon
orderingTyCon
ordGTDataCon :: DataCon
ordGTDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
ordGTDataConName [] [] TyCon
orderingTyCon
ordLTDataConId, ordEQDataConId, ordGTDataConId :: Id
ordLTDataConId :: TyVar
ordLTDataConId = DataCon -> TyVar
dataConWorkId DataCon
ordLTDataCon
ordEQDataConId :: TyVar
ordEQDataConId = DataCon -> TyVar
dataConWorkId DataCon
ordEQDataCon
ordGTDataConId :: TyVar
ordGTDataConId = DataCon -> TyVar
dataConWorkId DataCon
ordGTDataCon
mkListTy :: Type -> Type
mkListTy :: Type -> Type
mkListTy Type
ty = TyCon -> [Type] -> Type
mkTyConApp TyCon
listTyCon [Type
ty]
listTyCon :: TyCon
listTyCon :: TyCon
listTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
listTyConName Maybe CType
forall a. Maybe a
Nothing [TyVar
alphaTyVar] [DataCon
nilDataCon, DataCon
consDataCon]
nilDataCon :: DataCon
nilDataCon :: DataCon
nilDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
nilDataConName [TyVar]
alpha_tyvar [] TyCon
listTyCon
consDataCon :: DataCon
consDataCon :: DataCon
consDataCon = Bool
-> Name
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> [Scaled Type]
-> TyCon
-> DataCon
pcDataConWithFixity Bool
True
Name
consDataConName
[TyVar]
alpha_tyvar [] [TyVar]
alpha_tyvar
((Type -> Scaled Type) -> [Type] -> [Scaled Type]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Scaled Type
forall a. a -> Scaled a
linear [Type
alphaTy, TyCon -> [Type] -> Type
mkTyConApp TyCon
listTyCon [Type]
alpha_ty]) TyCon
listTyCon
maybeTyCon :: TyCon
maybeTyCon :: TyCon
maybeTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
maybeTyConName Maybe CType
forall a. Maybe a
Nothing [TyVar]
alpha_tyvar
[DataCon
nothingDataCon, DataCon
justDataCon]
nothingDataCon :: DataCon
nothingDataCon :: DataCon
nothingDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
nothingDataConName [TyVar]
alpha_tyvar [] TyCon
maybeTyCon
justDataCon :: DataCon
justDataCon :: DataCon
justDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
justDataConName [TyVar]
alpha_tyvar [Type
alphaTy] TyCon
maybeTyCon
mkTupleTy :: Boxity -> [Type] -> Type
mkTupleTy :: Boxity -> [Type] -> Type
mkTupleTy Boxity
Boxed [Type
ty] = Type
ty
mkTupleTy Boxity
boxity [Type]
tys = Boxity -> [Type] -> Type
mkTupleTy1 Boxity
boxity [Type]
tys
mkTupleTy1 :: Boxity -> [Type] -> Type
mkTupleTy1 :: Boxity -> [Type] -> Type
mkTupleTy1 Boxity
Boxed [Type]
tys = TyCon -> [Type] -> Type
mkTyConApp (Boxity -> Arity -> TyCon
tupleTyCon Boxity
Boxed ([Type] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [Type]
tys)) [Type]
tys
mkTupleTy1 Boxity
Unboxed [Type]
tys = TyCon -> [Type] -> Type
mkTyConApp (Boxity -> Arity -> TyCon
tupleTyCon Boxity
Unboxed ([Type] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [Type]
tys))
((Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map HasDebugCallStack => Type -> Type
Type -> Type
getRuntimeRep [Type]
tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
tys)
mkBoxedTupleTy :: [Type] -> Type
mkBoxedTupleTy :: [Type] -> Type
mkBoxedTupleTy [Type]
tys = Boxity -> [Type] -> Type
mkTupleTy Boxity
Boxed [Type]
tys
unitTy :: Type
unitTy :: Type
unitTy = Boxity -> [Type] -> Type
mkTupleTy Boxity
Boxed []
mkSumTy :: [Type] -> Type
mkSumTy :: [Type] -> Type
mkSumTy [Type]
tys = TyCon -> [Type] -> Type
mkTyConApp (Arity -> TyCon
sumTyCon ([Type] -> Arity
forall (t :: * -> *) a. Foldable t => t a -> Arity
length [Type]
tys))
((Type -> Type) -> [Type] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map HasDebugCallStack => Type -> Type
Type -> Type
getRuntimeRep [Type]
tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
tys)
promotedFalseDataCon, promotedTrueDataCon :: TyCon
promotedTrueDataCon :: TyCon
promotedTrueDataCon = DataCon -> TyCon
promoteDataCon DataCon
trueDataCon
promotedFalseDataCon :: TyCon
promotedFalseDataCon = DataCon -> TyCon
promoteDataCon DataCon
falseDataCon
promotedNothingDataCon, promotedJustDataCon :: TyCon
promotedNothingDataCon :: TyCon
promotedNothingDataCon = DataCon -> TyCon
promoteDataCon DataCon
nothingDataCon
promotedJustDataCon :: TyCon
promotedJustDataCon = DataCon -> TyCon
promoteDataCon DataCon
justDataCon
promotedLTDataCon
, promotedEQDataCon
, promotedGTDataCon
:: TyCon
promotedLTDataCon :: TyCon
promotedLTDataCon = DataCon -> TyCon
promoteDataCon DataCon
ordLTDataCon
promotedEQDataCon :: TyCon
promotedEQDataCon = DataCon -> TyCon
promoteDataCon DataCon
ordEQDataCon
promotedGTDataCon :: TyCon
promotedGTDataCon = DataCon -> TyCon
promoteDataCon DataCon
ordGTDataCon
promotedConsDataCon, promotedNilDataCon :: TyCon
promotedConsDataCon :: TyCon
promotedConsDataCon = DataCon -> TyCon
promoteDataCon DataCon
consDataCon
promotedNilDataCon :: TyCon
promotedNilDataCon = DataCon -> TyCon
promoteDataCon DataCon
nilDataCon
mkPromotedListTy :: Kind
-> [Type]
-> Type
mkPromotedListTy :: Type -> [Type] -> Type
mkPromotedListTy Type
k [Type]
tys
= (Type -> Type -> Type) -> Type -> [Type] -> Type
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Type -> Type -> Type
cons Type
nil [Type]
tys
where
cons :: Type
-> Type
-> Type
cons :: Type -> Type -> Type
cons Type
elt Type
list = TyCon -> [Type] -> Type
mkTyConApp TyCon
promotedConsDataCon [Type
k, Type
elt, Type
list]
nil :: Type
nil :: Type
nil = TyCon -> [Type] -> Type
mkTyConApp TyCon
promotedNilDataCon [Type
k]
extractPromotedList :: Type
-> [Type]
Type
tys = Type -> [Type]
go Type
tys
where
go :: Type -> [Type]
go Type
list_ty
| Just (TyCon
tc, [Type
_k, Type
t, Type
ts]) <- HasDebugCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
splitTyConApp_maybe Type
list_ty
= ASSERT( tc `hasKey` consDataConKey )
Type
t Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: Type -> [Type]
go Type
ts
| Just (TyCon
tc, [Type
_k]) <- HasDebugCallStack => Type -> Maybe (TyCon, [Type])
Type -> Maybe (TyCon, [Type])
splitTyConApp_maybe Type
list_ty
= ASSERT( tc `hasKey` nilDataConKey )
[]
| Bool
otherwise
= [Char] -> SDoc -> [Type]
forall a. HasCallStack => [Char] -> SDoc -> a
pprPanic [Char]
"extractPromotedList" (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
tys)
integerTyConName
, integerISDataConName
, integerIPDataConName
, integerINDataConName
:: Name
integerTyConName :: Name
integerTyConName
= BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_INTEGER
([Char] -> FastString
fsLit [Char]
"Integer")
Unique
integerTyConKey
TyCon
integerTyCon
integerISDataConName :: Name
integerISDataConName
= BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_INTEGER
([Char] -> FastString
fsLit [Char]
"IS")
Unique
integerISDataConKey
DataCon
integerISDataCon
integerIPDataConName :: Name
integerIPDataConName
= BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_INTEGER
([Char] -> FastString
fsLit [Char]
"IP")
Unique
integerIPDataConKey
DataCon
integerIPDataCon
integerINDataConName :: Name
integerINDataConName
= BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_INTEGER
([Char] -> FastString
fsLit [Char]
"IN")
Unique
integerINDataConKey
DataCon
integerINDataCon
integerTy :: Type
integerTy :: Type
integerTy = TyCon -> Type
mkTyConTy TyCon
integerTyCon
integerTyCon :: TyCon
integerTyCon :: TyCon
integerTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
integerTyConName Maybe CType
forall a. Maybe a
Nothing []
[DataCon
integerISDataCon, DataCon
integerIPDataCon, DataCon
integerINDataCon]
integerISDataCon :: DataCon
integerISDataCon :: DataCon
integerISDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
integerISDataConName [] [Type
intPrimTy] TyCon
integerTyCon
integerIPDataCon :: DataCon
integerIPDataCon :: DataCon
integerIPDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
integerIPDataConName [] [Type
byteArrayPrimTy] TyCon
integerTyCon
integerINDataCon :: DataCon
integerINDataCon :: DataCon
integerINDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
integerINDataConName [] [Type
byteArrayPrimTy] TyCon
integerTyCon
naturalTyConName
, naturalNSDataConName
, naturalNBDataConName
:: Name
naturalTyConName :: Name
naturalTyConName
= BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_NATURAL
([Char] -> FastString
fsLit [Char]
"Natural")
Unique
naturalTyConKey
TyCon
naturalTyCon
naturalNSDataConName :: Name
naturalNSDataConName
= BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_NATURAL
([Char] -> FastString
fsLit [Char]
"NS")
Unique
naturalNSDataConKey
DataCon
naturalNSDataCon
naturalNBDataConName :: Name
naturalNBDataConName
= BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
mkWiredInDataConName
BuiltInSyntax
UserSyntax
Module
gHC_NUM_NATURAL
([Char] -> FastString
fsLit [Char]
"NB")
Unique
naturalNBDataConKey
DataCon
naturalNBDataCon
naturalTy :: Type
naturalTy :: Type
naturalTy = TyCon -> Type
mkTyConTy TyCon
naturalTyCon
naturalTyCon :: TyCon
naturalTyCon :: TyCon
naturalTyCon = Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon
pcTyCon Name
naturalTyConName Maybe CType
forall a. Maybe a
Nothing []
[DataCon
naturalNSDataCon, DataCon
naturalNBDataCon]
naturalNSDataCon :: DataCon
naturalNSDataCon :: DataCon
naturalNSDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
naturalNSDataConName [] [Type
wordPrimTy] TyCon
naturalTyCon
naturalNBDataCon :: DataCon
naturalNBDataCon :: DataCon
naturalNBDataCon = Name -> [TyVar] -> [Type] -> TyCon -> DataCon
pcDataCon Name
naturalNBDataConName [] [Type
byteArrayPrimTy] TyCon
naturalTyCon