{-# LANGUAGE CPP, ScopedTypeVariables, TupleSections #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module TcGenGenerics (canDoGenerics, canDoGenerics1,
GenericKind(..),
gen_Generic_binds, get_gen1_constrained_tys) where
import GhcPrelude
import GHC.Hs
import Type
import TcType
import TcGenDeriv
import TcGenFunctor
import DataCon
import TyCon
import FamInstEnv ( FamInst, FamFlavor(..), mkSingleCoAxiom )
import FamInst
import Module ( moduleName, moduleNameFS
, moduleUnitId, unitIdFS, getModule )
import IfaceEnv ( newGlobalBinder )
import Name hiding ( varName )
import RdrName
import BasicTypes
import TysPrim
import TysWiredIn
import PrelNames
import TcEnv
import TcRnMonad
import HscTypes
import ErrUtils( Validity(..), andValid )
import SrcLoc
import Bag
import VarEnv
import VarSet (elemVarSet)
import Outputable
import FastString
import Util
import Control.Monad (mplus)
import Data.List (zip4, partition)
import Data.Maybe (isJust)
#include "HsVersions.h"
gen_Generic_binds :: GenericKind -> TyCon -> [Type]
-> TcM (LHsBinds GhcPs, FamInst)
gen_Generic_binds :: GenericKind -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, FamInst)
gen_Generic_binds GenericKind
gk TyCon
tc [Type]
inst_tys = do
FamInst
repTyInsts <- GenericKind -> TyCon -> [Type] -> TcM FamInst
tc_mkRepFamInsts GenericKind
gk TyCon
tc [Type]
inst_tys
(LHsBinds GhcPs, FamInst) -> TcM (LHsBinds GhcPs, FamInst)
forall (m :: * -> *) a. Monad m => a -> m a
return (GenericKind -> TyCon -> LHsBinds GhcPs
mkBindsRep GenericKind
gk TyCon
tc, FamInst
repTyInsts)
get_gen1_constrained_tys :: TyVar -> Type -> [Type]
get_gen1_constrained_tys :: TyVar -> Type -> [Type]
get_gen1_constrained_tys TyVar
argVar
= TyVar -> ArgTyAlg [Type] -> Type -> [Type]
forall a. TyVar -> ArgTyAlg a -> Type -> a
argTyFold TyVar
argVar (ArgTyAlg [Type] -> Type -> [Type])
-> ArgTyAlg [Type] -> Type -> [Type]
forall a b. (a -> b) -> a -> b
$ ArgTyAlg :: forall a.
(Type -> a) -> a -> (Type -> a) -> (Type -> a -> a) -> ArgTyAlg a
ArgTyAlg { ata_rec0 :: Type -> [Type]
ata_rec0 = [Type] -> Type -> [Type]
forall a b. a -> b -> a
const []
, ata_par1 :: [Type]
ata_par1 = [], ata_rec1 :: Type -> [Type]
ata_rec1 = [Type] -> Type -> [Type]
forall a b. a -> b -> a
const []
, ata_comp :: Type -> [Type] -> [Type]
ata_comp = (:) }
canDoGenerics :: TyCon -> Validity
canDoGenerics :: TyCon -> Validity
canDoGenerics TyCon
tc
= [Validity] -> Validity
mergeErrors (
(if (Bool -> Bool
not ([Type] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (TyCon -> [Type]
tyConStupidTheta TyCon
tc)))
then (MsgDoc -> Validity
NotValid (MsgDoc
tc_name MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
"must not have a datatype context"))
else Validity
IsValid)
Validity -> [Validity] -> [Validity]
forall a. a -> [a] -> [a]
: ((DataCon -> Validity) -> [DataCon] -> [Validity]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> Validity
bad_con (TyCon -> [DataCon]
tyConDataCons TyCon
tc)))
where
tc_name :: MsgDoc
tc_name = TyCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TyCon -> MsgDoc) -> TyCon -> MsgDoc
forall a b. (a -> b) -> a -> b
$ case TyCon -> Maybe (TyCon, [Type])
tyConFamInst_maybe TyCon
tc of
Just (TyCon
ptc, [Type]
_) -> TyCon
ptc
Maybe (TyCon, [Type])
_ -> TyCon
tc
bad_con :: DataCon -> Validity
bad_con DataCon
dc = if ((Type -> Bool) -> [Type] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Type -> Bool
bad_arg_type (DataCon -> [Type]
dataConOrigArgTys DataCon
dc))
then (MsgDoc -> Validity
NotValid (DataCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr DataCon
dc MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text
String
"must not have exotic unlifted or polymorphic arguments"))
else (if (Bool -> Bool
not (DataCon -> Bool
isVanillaDataCon DataCon
dc))
then (MsgDoc -> Validity
NotValid (DataCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr DataCon
dc MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
"must be a vanilla data constructor"))
else Validity
IsValid)
bad_arg_type :: Type -> Bool
bad_arg_type Type
ty = (HasDebugCallStack => Type -> Bool
Type -> Bool
isUnliftedType Type
ty Bool -> Bool -> Bool
&& Bool -> Bool
not (Type -> Bool
allowedUnliftedTy Type
ty))
Bool -> Bool -> Bool
|| Bool -> Bool
not (Type -> Bool
isTauTy Type
ty)
allowedUnliftedTy :: Type -> Bool
allowedUnliftedTy :: Type -> Bool
allowedUnliftedTy = Maybe (RdrName, RdrName) -> Bool
forall a. Maybe a -> Bool
isJust (Maybe (RdrName, RdrName) -> Bool)
-> (Type -> Maybe (RdrName, RdrName)) -> Type -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Maybe (RdrName, RdrName)
unboxedRepRDRs
mergeErrors :: [Validity] -> Validity
mergeErrors :: [Validity] -> Validity
mergeErrors [] = Validity
IsValid
mergeErrors (NotValid MsgDoc
s:[Validity]
t) = case [Validity] -> Validity
mergeErrors [Validity]
t of
Validity
IsValid -> MsgDoc -> Validity
NotValid MsgDoc
s
NotValid MsgDoc
s' -> MsgDoc -> Validity
NotValid (MsgDoc
s MsgDoc -> MsgDoc -> MsgDoc
<> String -> MsgDoc
text String
", and" MsgDoc -> MsgDoc -> MsgDoc
$$ MsgDoc
s')
mergeErrors (Validity
IsValid : [Validity]
t) = [Validity] -> Validity
mergeErrors [Validity]
t
data Check_for_CanDoGenerics1 = CCDG1
{ Check_for_CanDoGenerics1 -> Bool
_ccdg1_hasParam :: Bool
, Check_for_CanDoGenerics1 -> Validity
_ccdg1_errors :: Validity
}
canDoGenerics1 :: TyCon -> Validity
canDoGenerics1 :: TyCon -> Validity
canDoGenerics1 TyCon
rep_tc =
TyCon -> Validity
canDoGenerics TyCon
rep_tc Validity -> Validity -> Validity
`andValid` Validity
additionalChecks
where
additionalChecks :: Validity
additionalChecks
| [TyVar] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (TyCon -> [TyVar]
tyConTyVars TyCon
rep_tc) = MsgDoc -> Validity
NotValid (MsgDoc -> Validity) -> MsgDoc -> Validity
forall a b. (a -> b) -> a -> b
$
String -> MsgDoc
text String
"Data type" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (TyCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr TyCon
rep_tc)
MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
"must have some type parameters"
| Bool
otherwise = [Validity] -> Validity
mergeErrors ([Validity] -> Validity) -> [Validity] -> Validity
forall a b. (a -> b) -> a -> b
$ (DataCon -> [Validity]) -> [DataCon] -> [Validity]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap DataCon -> [Validity]
check_con [DataCon]
data_cons
data_cons :: [DataCon]
data_cons = TyCon -> [DataCon]
tyConDataCons TyCon
rep_tc
check_con :: DataCon -> [Validity]
check_con DataCon
con = case DataCon -> Validity
check_vanilla DataCon
con of
j :: Validity
j@(NotValid {}) -> [Validity
j]
Validity
IsValid -> Check_for_CanDoGenerics1 -> Validity
_ccdg1_errors (Check_for_CanDoGenerics1 -> Validity)
-> [Check_for_CanDoGenerics1] -> [Validity]
forall a b. (a -> b) -> [a] -> [b]
`map` FFoldType Check_for_CanDoGenerics1
-> DataCon -> [Check_for_CanDoGenerics1]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs (DataCon -> FFoldType Check_for_CanDoGenerics1
ft_check DataCon
con) DataCon
con
bad :: DataCon -> SDoc -> SDoc
bad :: DataCon -> MsgDoc -> MsgDoc
bad DataCon
con MsgDoc
msg = String -> MsgDoc
text String
"Constructor" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (DataCon -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr DataCon
con) MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
msg
check_vanilla :: DataCon -> Validity
check_vanilla :: DataCon -> Validity
check_vanilla DataCon
con | DataCon -> Bool
isVanillaDataCon DataCon
con = Validity
IsValid
| Bool
otherwise = MsgDoc -> Validity
NotValid (DataCon -> MsgDoc -> MsgDoc
bad DataCon
con MsgDoc
existential)
bmzero :: Check_for_CanDoGenerics1
bmzero = Bool -> Validity -> Check_for_CanDoGenerics1
CCDG1 Bool
False Validity
IsValid
bmbad :: DataCon -> MsgDoc -> Check_for_CanDoGenerics1
bmbad DataCon
con MsgDoc
s = Bool -> Validity -> Check_for_CanDoGenerics1
CCDG1 Bool
True (Validity -> Check_for_CanDoGenerics1)
-> Validity -> Check_for_CanDoGenerics1
forall a b. (a -> b) -> a -> b
$ MsgDoc -> Validity
NotValid (MsgDoc -> Validity) -> MsgDoc -> Validity
forall a b. (a -> b) -> a -> b
$ DataCon -> MsgDoc -> MsgDoc
bad DataCon
con MsgDoc
s
bmplus :: Check_for_CanDoGenerics1
-> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1
bmplus (CCDG1 Bool
b1 Validity
m1) (CCDG1 Bool
b2 Validity
m2) = Bool -> Validity -> Check_for_CanDoGenerics1
CCDG1 (Bool
b1 Bool -> Bool -> Bool
|| Bool
b2) (Validity
m1 Validity -> Validity -> Validity
`andValid` Validity
m2)
ft_check :: DataCon -> FFoldType Check_for_CanDoGenerics1
ft_check :: DataCon -> FFoldType Check_for_CanDoGenerics1
ft_check DataCon
con = FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TyVar -> a -> a)
-> FFoldType a
FT
{ ft_triv :: Check_for_CanDoGenerics1
ft_triv = Check_for_CanDoGenerics1
bmzero
, ft_var :: Check_for_CanDoGenerics1
ft_var = Check_for_CanDoGenerics1
caseVar, ft_co_var :: Check_for_CanDoGenerics1
ft_co_var = Check_for_CanDoGenerics1
caseVar
, ft_tup :: TyCon -> [Check_for_CanDoGenerics1] -> Check_for_CanDoGenerics1
ft_tup = \TyCon
_ [Check_for_CanDoGenerics1]
components -> if (Check_for_CanDoGenerics1 -> Bool)
-> [Check_for_CanDoGenerics1] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Check_for_CanDoGenerics1 -> Bool
_ccdg1_hasParam ([Check_for_CanDoGenerics1] -> [Check_for_CanDoGenerics1]
forall a. [a] -> [a]
init [Check_for_CanDoGenerics1]
components)
then DataCon -> MsgDoc -> Check_for_CanDoGenerics1
bmbad DataCon
con MsgDoc
wrong_arg
else (Check_for_CanDoGenerics1
-> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1)
-> Check_for_CanDoGenerics1
-> [Check_for_CanDoGenerics1]
-> Check_for_CanDoGenerics1
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Check_for_CanDoGenerics1
-> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1
bmplus Check_for_CanDoGenerics1
bmzero [Check_for_CanDoGenerics1]
components
, ft_fun :: Check_for_CanDoGenerics1
-> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1
ft_fun = \Check_for_CanDoGenerics1
dom Check_for_CanDoGenerics1
rng ->
if Check_for_CanDoGenerics1 -> Bool
_ccdg1_hasParam Check_for_CanDoGenerics1
dom
then DataCon -> MsgDoc -> Check_for_CanDoGenerics1
bmbad DataCon
con MsgDoc
wrong_arg
else Check_for_CanDoGenerics1
-> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1
bmplus Check_for_CanDoGenerics1
dom Check_for_CanDoGenerics1
rng
, ft_ty_app :: Type -> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1
ft_ty_app = \Type
_ Check_for_CanDoGenerics1
arg -> Check_for_CanDoGenerics1
arg
, ft_bad_app :: Check_for_CanDoGenerics1
ft_bad_app = DataCon -> MsgDoc -> Check_for_CanDoGenerics1
bmbad DataCon
con MsgDoc
wrong_arg
, ft_forall :: TyVar -> Check_for_CanDoGenerics1 -> Check_for_CanDoGenerics1
ft_forall = \TyVar
_ Check_for_CanDoGenerics1
body -> Check_for_CanDoGenerics1
body
}
where
caseVar :: Check_for_CanDoGenerics1
caseVar = Bool -> Validity -> Check_for_CanDoGenerics1
CCDG1 Bool
True Validity
IsValid
existential :: MsgDoc
existential = String -> MsgDoc
text String
"must not have existential arguments"
wrong_arg :: MsgDoc
wrong_arg = String -> MsgDoc
text String
"applies a type to an argument involving the last parameter"
MsgDoc -> MsgDoc -> MsgDoc
$$ String -> MsgDoc
text String
"but the applied type is not of kind * -> *"
type US = Int
type Alt = (LPat GhcPs, LHsExpr GhcPs)
data GenericKind = Gen0 | Gen1
data GenericKind_ = Gen0_ | Gen1_ TyVar
data GenericKind_DC = Gen0_DC | Gen1_DC TyVar
forgetArgVar :: GenericKind_DC -> GenericKind
forgetArgVar :: GenericKind_DC -> GenericKind
forgetArgVar GenericKind_DC
Gen0_DC = GenericKind
Gen0
forgetArgVar Gen1_DC{} = GenericKind
Gen1
gk2gkDC :: GenericKind_ -> DataCon -> GenericKind_DC
gk2gkDC :: GenericKind_ -> DataCon -> GenericKind_DC
gk2gkDC GenericKind_
Gen0_ DataCon
_ = GenericKind_DC
Gen0_DC
gk2gkDC Gen1_{} DataCon
d = TyVar -> GenericKind_DC
Gen1_DC (TyVar -> GenericKind_DC) -> TyVar -> GenericKind_DC
forall a b. (a -> b) -> a -> b
$ [TyVar] -> TyVar
forall a. [a] -> a
last ([TyVar] -> TyVar) -> [TyVar] -> TyVar
forall a b. (a -> b) -> a -> b
$ DataCon -> [TyVar]
dataConUnivTyVars DataCon
d
mkBindsRep :: GenericKind -> TyCon -> LHsBinds GhcPs
mkBindsRep :: GenericKind -> TyCon -> LHsBinds GhcPs
mkBindsRep GenericKind
gk TyCon
tycon =
LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag (Located RdrName -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
from01_RDR) [LMatch GhcPs (LHsExpr GhcPs)
from_eqn])
LHsBinds GhcPs -> LHsBinds GhcPs -> LHsBinds GhcPs
forall a. Bag a -> Bag a -> Bag a
`unionBags`
LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag (Located RdrName -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
to01_RDR) [LMatch GhcPs (LHsExpr GhcPs)
to_eqn])
where
from_eqn :: LMatch GhcPs (LHsExpr GhcPs)
from_eqn = LPat GhcPs -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
LPat (GhcPass p)
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkHsCaseAlt LPat GhcPs
x_Pat (LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs))
-> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> LHsExpr GhcPs
mkM1_E
(LHsExpr GhcPs -> LHsExpr GhcPs) -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar (LHsExpr GhcPs -> LHsExpr GhcPs) -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsExpr GhcPs
nlHsCase LHsExpr GhcPs
x_Expr [LMatch GhcPs (LHsExpr GhcPs)]
from_matches
to_eqn :: LMatch GhcPs (LHsExpr GhcPs)
to_eqn = LPat GhcPs -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
LPat (GhcPass p)
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkHsCaseAlt (LPat GhcPs -> LPat GhcPs
mkM1_P LPat GhcPs
x_Pat) (LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs))
-> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsExpr GhcPs
nlHsCase LHsExpr GhcPs
x_Expr [LMatch GhcPs (LHsExpr GhcPs)]
to_matches
from_matches :: [LMatch GhcPs (LHsExpr GhcPs)]
from_matches = [LPat GhcPs -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
LPat (GhcPass p)
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkHsCaseAlt Located (Pat GhcPs)
LPat GhcPs
pat LHsExpr GhcPs
rhs | (Located (Pat GhcPs)
pat,LHsExpr GhcPs
rhs) <- [(Located (Pat GhcPs), LHsExpr GhcPs)]
[Alt]
from_alts]
to_matches :: [LMatch GhcPs (LHsExpr GhcPs)]
to_matches = [LPat GhcPs -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
LPat (GhcPass p)
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkHsCaseAlt Located (Pat GhcPs)
LPat GhcPs
pat LHsExpr GhcPs
rhs | (Located (Pat GhcPs)
pat,LHsExpr GhcPs
rhs) <- [(Located (Pat GhcPs), LHsExpr GhcPs)]
[Alt]
to_alts ]
loc :: SrcSpan
loc = SrcLoc -> SrcSpan
srcLocSpan (TyCon -> SrcLoc
forall a. NamedThing a => a -> SrcLoc
getSrcLoc TyCon
tycon)
datacons :: [DataCon]
datacons = TyCon -> [DataCon]
tyConDataCons TyCon
tycon
(RdrName
from01_RDR, RdrName
to01_RDR) = case GenericKind
gk of
GenericKind
Gen0 -> (RdrName
from_RDR, RdrName
to_RDR)
GenericKind
Gen1 -> (RdrName
from1_RDR, RdrName
to1_RDR)
from_alts, to_alts :: [Alt]
([(Located (Pat GhcPs), LHsExpr GhcPs)]
from_alts, [(Located (Pat GhcPs), LHsExpr GhcPs)]
to_alts) = GenericKind_ -> US -> [DataCon] -> ([Alt], [Alt])
mkSum GenericKind_
gk_ (US
1 :: US) [DataCon]
datacons
where gk_ :: GenericKind_
gk_ = case GenericKind
gk of
GenericKind
Gen0 -> GenericKind_
Gen0_
GenericKind
Gen1 -> ASSERT(tyvars `lengthAtLeast` 1)
TyVar -> GenericKind_
Gen1_ ([TyVar] -> TyVar
forall a. [a] -> a
last [TyVar]
tyvars)
where tyvars :: [TyVar]
tyvars = TyCon -> [TyVar]
tyConTyVars TyCon
tycon
tc_mkRepFamInsts :: GenericKind
-> TyCon
-> [Type]
-> TcM FamInst
tc_mkRepFamInsts :: GenericKind -> TyCon -> [Type] -> TcM FamInst
tc_mkRepFamInsts GenericKind
gk TyCon
tycon [Type]
inst_tys =
do {
TyCon
fam_tc <- case GenericKind
gk of
GenericKind
Gen0 -> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
repTyConName
GenericKind
Gen1 -> Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
rep1TyConName
; FamInstEnvs
fam_envs <- TcM FamInstEnvs
tcGetFamInstEnvs
; let
(Type
arg_ki, Type
inst_ty) = case (GenericKind
gk, [Type]
inst_tys) of
(GenericKind
Gen0, [Type
inst_t]) -> (Type
liftedTypeKind, Type
inst_t)
(GenericKind
Gen1, [Type
arg_k, Type
inst_t]) -> (Type
arg_k, Type
inst_t)
(GenericKind, [Type])
_ -> String -> MsgDoc -> (Type, Type)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic String
"tc_mkRepFamInsts" ([Type] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [Type]
inst_tys)
; let mbFamInst :: Maybe (TyCon, [Type])
mbFamInst = TyCon -> Maybe (TyCon, [Type])
tyConFamInst_maybe TyCon
tycon
ptc :: TyCon
ptc = TyCon
-> ((TyCon, [Type]) -> TyCon) -> Maybe (TyCon, [Type]) -> TyCon
forall b a. b -> (a -> b) -> Maybe a -> b
maybe TyCon
tycon (TyCon, [Type]) -> TyCon
forall a b. (a, b) -> a
fst Maybe (TyCon, [Type])
mbFamInst
(TyCon
_, [Type]
inst_args, Coercion
_) = FamInstEnvs -> TyCon -> [Type] -> (TyCon, [Type], Coercion)
tcLookupDataFamInst FamInstEnvs
fam_envs TyCon
ptc ([Type] -> (TyCon, [Type], Coercion))
-> [Type] -> (TyCon, [Type], Coercion)
forall a b. (a -> b) -> a -> b
$ (TyCon, [Type]) -> [Type]
forall a b. (a, b) -> b
snd
((TyCon, [Type]) -> [Type]) -> (TyCon, [Type]) -> [Type]
forall a b. (a -> b) -> a -> b
$ Type -> (TyCon, [Type])
tcSplitTyConApp Type
inst_ty
; let
([TyVar]
tyvars, GenericKind_
gk_) = case GenericKind
gk of
GenericKind
Gen0 -> ([TyVar]
all_tyvars, GenericKind_
Gen0_)
GenericKind
Gen1 -> ASSERT(not $ null all_tyvars)
([TyVar] -> [TyVar]
forall a. [a] -> [a]
init [TyVar]
all_tyvars, TyVar -> GenericKind_
Gen1_ (TyVar -> GenericKind_) -> TyVar -> GenericKind_
forall a b. (a -> b) -> a -> b
$ [TyVar] -> TyVar
forall a. [a] -> a
last [TyVar]
all_tyvars)
where all_tyvars :: [TyVar]
all_tyvars = TyCon -> [TyVar]
tyConTyVars TyCon
tycon
; Type
repTy <- GenericKind_ -> TyCon -> Type -> TcM Type
tc_mkRepTy GenericKind_
gk_ TyCon
tycon Type
arg_ki
; Module
mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
getModule
; SrcSpan
loc <- TcRn SrcSpan
getSrcSpanM
; let tc_occ :: OccName
tc_occ = Name -> OccName
nameOccName (TyCon -> Name
tyConName TyCon
tycon)
rep_occ :: OccName
rep_occ = case GenericKind
gk of GenericKind
Gen0 -> OccName -> OccName
mkGenR OccName
tc_occ; GenericKind
Gen1 -> OccName -> OccName
mkGen1R OccName
tc_occ
; Name
rep_name <- Module -> OccName -> SrcSpan -> TcRnIf TcGblEnv TcLclEnv Name
forall a b. Module -> OccName -> SrcSpan -> TcRnIf a b Name
newGlobalBinder Module
mod OccName
rep_occ SrcSpan
loc
; let ([TyVar]
env_tyvars, [Type]
env_inst_args)
= case GenericKind_
gk_ of
GenericKind_
Gen0_ -> ([TyVar]
tyvars, [Type]
inst_args)
Gen1_ TyVar
last_tv
-> ( TyVar
last_tv TyVar -> [TyVar] -> [TyVar]
forall a. a -> [a] -> [a]
: [TyVar]
tyvars
, Type -> Type
anyTypeOfKind (TyVar -> Type
tyVarKind TyVar
last_tv) Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: [Type]
inst_args )
env :: TvSubstEnv
env = [TyVar] -> [Type] -> TvSubstEnv
HasDebugCallStack => [TyVar] -> [Type] -> TvSubstEnv
zipTyEnv [TyVar]
env_tyvars [Type]
env_inst_args
in_scope :: InScopeSet
in_scope = VarSet -> InScopeSet
mkInScopeSet ([Type] -> VarSet
tyCoVarsOfTypes [Type]
inst_tys)
subst :: TCvSubst
subst = InScopeSet -> TvSubstEnv -> TCvSubst
mkTvSubst InScopeSet
in_scope TvSubstEnv
env
repTy' :: Type
repTy' = TCvSubst -> Type -> Type
substTyUnchecked TCvSubst
subst Type
repTy
tcv' :: [TyVar]
tcv' = Type -> [TyVar]
tyCoVarsOfTypeList Type
inst_ty
([TyVar]
tv', [TyVar]
cv') = (TyVar -> Bool) -> [TyVar] -> ([TyVar], [TyVar])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition TyVar -> Bool
isTyVar [TyVar]
tcv'
tvs' :: [TyVar]
tvs' = [TyVar] -> [TyVar]
scopedSort [TyVar]
tv'
cvs' :: [TyVar]
cvs' = [TyVar] -> [TyVar]
scopedSort [TyVar]
cv'
axiom :: CoAxiom Unbranched
axiom = Role
-> Name
-> [TyVar]
-> [TyVar]
-> [TyVar]
-> TyCon
-> [Type]
-> Type
-> CoAxiom Unbranched
mkSingleCoAxiom Role
Nominal Name
rep_name [TyVar]
tvs' [] [TyVar]
cvs'
TyCon
fam_tc [Type]
inst_tys Type
repTy'
; FamFlavor -> CoAxiom Unbranched -> TcM FamInst
newFamInst FamFlavor
SynFamilyInst CoAxiom Unbranched
axiom }
data ArgTyAlg a = ArgTyAlg
{ ArgTyAlg a -> Type -> a
ata_rec0 :: (Type -> a)
, ArgTyAlg a -> a
ata_par1 :: a, ArgTyAlg a -> Type -> a
ata_rec1 :: (Type -> a)
, ArgTyAlg a -> Type -> a -> a
ata_comp :: (Type -> a -> a)
}
argTyFold :: forall a. TyVar -> ArgTyAlg a -> Type -> a
argTyFold :: TyVar -> ArgTyAlg a -> Type -> a
argTyFold TyVar
argVar (ArgTyAlg {ata_rec0 :: forall a. ArgTyAlg a -> Type -> a
ata_rec0 = Type -> a
mkRec0,
ata_par1 :: forall a. ArgTyAlg a -> a
ata_par1 = a
mkPar1, ata_rec1 :: forall a. ArgTyAlg a -> Type -> a
ata_rec1 = Type -> a
mkRec1,
ata_comp :: forall a. ArgTyAlg a -> Type -> a -> a
ata_comp = Type -> a -> a
mkComp}) =
\Type
t -> a -> (a -> a) -> Maybe a -> a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Type -> a
mkRec0 Type
t) a -> a
forall a. a -> a
id (Maybe a -> a) -> Maybe a -> a
forall a b. (a -> b) -> a -> b
$ Type -> Maybe a
go Type
t where
go :: Type ->
Maybe a
go :: Type -> Maybe a
go Type
t = Maybe a
isParam Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Maybe a
isApp where
isParam :: Maybe a
isParam = do
TyVar
t' <- Type -> Maybe TyVar
getTyVar_maybe Type
t
a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ if TyVar
t' TyVar -> TyVar -> Bool
forall a. Eq a => a -> a -> Bool
== TyVar
argVar then a
mkPar1
else Type -> a
mkRec0 Type
t
isApp :: Maybe a
isApp = do
(Type
phi, Type
beta) <- Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
t
let interesting :: Bool
interesting = TyVar
argVar TyVar -> VarSet -> Bool
`elemVarSet` Type -> VarSet
exactTyCoVarsOfType Type
beta
if Bool -> Bool
not Bool
interesting then Maybe a
forall a. Maybe a
Nothing
else
if TyVar -> Maybe TyVar
forall a. a -> Maybe a
Just TyVar
argVar Maybe TyVar -> Maybe TyVar -> Bool
forall a. Eq a => a -> a -> Bool
== Type -> Maybe TyVar
getTyVar_maybe Type
beta then a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ Type -> a
mkRec1 Type
phi
else Type -> a -> a
mkComp Type
phi (a -> a) -> Maybe a -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Type -> Maybe a
go Type
beta
tc_mkRepTy ::
GenericKind_
-> TyCon
-> Kind
-> TcM Type
tc_mkRepTy :: GenericKind_ -> TyCon -> Type -> TcM Type
tc_mkRepTy GenericKind_
gk_ TyCon
tycon Type
k =
do
TyCon
d1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
d1TyConName
TyCon
c1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
c1TyConName
TyCon
s1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
s1TyConName
TyCon
rec0 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
rec0TyConName
TyCon
rec1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
rec1TyConName
TyCon
par1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
par1TyConName
TyCon
u1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
u1TyConName
TyCon
v1 <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
v1TyConName
TyCon
plus <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
sumTyConName
TyCon
times <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
prodTyConName
TyCon
comp <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
compTyConName
TyCon
uAddr <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
uAddrTyConName
TyCon
uChar <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
uCharTyConName
TyCon
uDouble <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
uDoubleTyConName
TyCon
uFloat <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
uFloatTyConName
TyCon
uInt <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
uIntTyConName
TyCon
uWord <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupTyCon Name
uWordTyConName
let tcLookupPromDataCon :: Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon = (DataCon -> TyCon)
-> IOEnv (Env TcGblEnv TcLclEnv) DataCon
-> IOEnv (Env TcGblEnv TcLclEnv) TyCon
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DataCon -> TyCon
promoteDataCon (IOEnv (Env TcGblEnv TcLclEnv) DataCon
-> IOEnv (Env TcGblEnv TcLclEnv) TyCon)
-> (Name -> IOEnv (Env TcGblEnv TcLclEnv) DataCon)
-> Name
-> IOEnv (Env TcGblEnv TcLclEnv) TyCon
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> IOEnv (Env TcGblEnv TcLclEnv) DataCon
tcLookupDataCon
TyCon
md <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
metaDataDataConName
TyCon
mc <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
metaConsDataConName
TyCon
ms <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
metaSelDataConName
TyCon
pPrefix <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
prefixIDataConName
TyCon
pInfix <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
infixIDataConName
TyCon
pLA <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
leftAssociativeDataConName
TyCon
pRA <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
rightAssociativeDataConName
TyCon
pNA <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
notAssociativeDataConName
TyCon
pSUpk <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
sourceUnpackDataConName
TyCon
pSNUpk <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
sourceNoUnpackDataConName
TyCon
pNSUpkness <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
noSourceUnpackednessDataConName
TyCon
pSLzy <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
sourceLazyDataConName
TyCon
pSStr <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
sourceStrictDataConName
TyCon
pNSStrness <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
noSourceStrictnessDataConName
TyCon
pDLzy <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
decidedLazyDataConName
TyCon
pDStr <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
decidedStrictDataConName
TyCon
pDUpk <- Name -> IOEnv (Env TcGblEnv TcLclEnv) TyCon
tcLookupPromDataCon Name
decidedUnpackDataConName
FixityEnv
fix_env <- TcRn FixityEnv
getFixityEnv
let mkSum' :: Type -> Type -> Type
mkSum' Type
a Type
b = TyCon -> [Type] -> Type
mkTyConApp TyCon
plus [Type
k,Type
a,Type
b]
mkProd :: Type -> Type -> Type
mkProd Type
a Type
b = TyCon -> [Type] -> Type
mkTyConApp TyCon
times [Type
k,Type
a,Type
b]
mkRec0 :: Type -> Type
mkRec0 Type
a = TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> Type
-> Type
-> Type
mkBoxTy TyCon
uAddr TyCon
uChar TyCon
uDouble TyCon
uFloat TyCon
uInt TyCon
uWord TyCon
rec0 Type
k Type
a
mkRec1 :: Type -> Type
mkRec1 Type
a = TyCon -> [Type] -> Type
mkTyConApp TyCon
rec1 [Type
k,Type
a]
mkPar1 :: Type
mkPar1 = TyCon -> Type
mkTyConTy TyCon
par1
mkD :: TyCon -> Type
mkD TyCon
a = TyCon -> [Type] -> Type
mkTyConApp TyCon
d1 [ Type
k, Type
metaDataTy, [DataCon] -> Type
sumP (TyCon -> [DataCon]
tyConDataCons TyCon
a) ]
mkC :: DataCon -> Type
mkC DataCon
a = TyCon -> [Type] -> Type
mkTyConApp TyCon
c1 [ Type
k
, DataCon -> Type
metaConsTy DataCon
a
, [Type] -> [HsSrcBang] -> [HsImplBang] -> [FieldLabel] -> Type
prod (DataCon -> [Type] -> [Type]
dataConInstOrigArgTys DataCon
a
([Type] -> [Type]) -> (TyCon -> [Type]) -> TyCon -> [Type]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [TyVar] -> [Type]
mkTyVarTys ([TyVar] -> [Type]) -> (TyCon -> [TyVar]) -> TyCon -> [Type]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyCon -> [TyVar]
tyConTyVars (TyCon -> [Type]) -> TyCon -> [Type]
forall a b. (a -> b) -> a -> b
$ TyCon
tycon)
(DataCon -> [HsSrcBang]
dataConSrcBangs DataCon
a)
(DataCon -> [HsImplBang]
dataConImplBangs DataCon
a)
(DataCon -> [FieldLabel]
dataConFieldLabels DataCon
a)]
mkS :: Maybe FieldLabel
-> SrcUnpackedness -> SrcStrictness -> HsImplBang -> Type -> Type
mkS Maybe FieldLabel
mlbl SrcUnpackedness
su SrcStrictness
ss HsImplBang
ib Type
a = TyCon -> [Type] -> Type
mkTyConApp TyCon
s1 [Type
k, Maybe FieldLabel
-> SrcUnpackedness -> SrcStrictness -> HsImplBang -> Type
metaSelTy Maybe FieldLabel
mlbl SrcUnpackedness
su SrcStrictness
ss HsImplBang
ib, Type
a]
sumP :: [DataCon] -> Type
sumP [DataCon]
l = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall a. (a -> a -> a) -> a -> [a] -> a
foldBal Type -> Type -> Type
mkSum' (TyCon -> [Type] -> Type
mkTyConApp TyCon
v1 [Type
k]) ([Type] -> Type) -> ([DataCon] -> [Type]) -> [DataCon] -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DataCon -> Type) -> [DataCon] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> Type
mkC ([DataCon] -> Type) -> [DataCon] -> Type
forall a b. (a -> b) -> a -> b
$ [DataCon]
l
prod :: [Type] -> [HsSrcBang] -> [HsImplBang] -> [FieldLabel] -> Type
prod :: [Type] -> [HsSrcBang] -> [HsImplBang] -> [FieldLabel] -> Type
prod [Type]
l [HsSrcBang]
sb [HsImplBang]
ib [FieldLabel]
fl = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall a. (a -> a -> a) -> a -> [a] -> a
foldBal Type -> Type -> Type
mkProd (TyCon -> [Type] -> Type
mkTyConApp TyCon
u1 [Type
k])
[ ASSERT(null fl || lengthExceeds fl j)
Type -> HsSrcBang -> HsImplBang -> Maybe FieldLabel -> Type
arg Type
t HsSrcBang
sb' HsImplBang
ib' (if [FieldLabel] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [FieldLabel]
fl
then Maybe FieldLabel
forall a. Maybe a
Nothing
else FieldLabel -> Maybe FieldLabel
forall a. a -> Maybe a
Just ([FieldLabel]
fl [FieldLabel] -> US -> FieldLabel
forall a. [a] -> US -> a
!! US
j))
| (Type
t,HsSrcBang
sb',HsImplBang
ib',US
j) <- [Type]
-> [HsSrcBang]
-> [HsImplBang]
-> [US]
-> [(Type, HsSrcBang, HsImplBang, US)]
forall a b c d. [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]
zip4 [Type]
l [HsSrcBang]
sb [HsImplBang]
ib [US
0..] ]
arg :: Type -> HsSrcBang -> HsImplBang -> Maybe FieldLabel -> Type
arg :: Type -> HsSrcBang -> HsImplBang -> Maybe FieldLabel -> Type
arg Type
t (HsSrcBang SourceText
_ SrcUnpackedness
su SrcStrictness
ss) HsImplBang
ib Maybe FieldLabel
fl = Maybe FieldLabel
-> SrcUnpackedness -> SrcStrictness -> HsImplBang -> Type -> Type
mkS Maybe FieldLabel
fl SrcUnpackedness
su SrcStrictness
ss HsImplBang
ib (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ case GenericKind_
gk_ of
GenericKind_
Gen0_ -> Type -> Type
mkRec0 Type
t
Gen1_ TyVar
argVar -> TyVar -> Type -> Type
argPar TyVar
argVar Type
t
where
argPar :: TyVar -> Type -> Type
argPar TyVar
argVar = TyVar -> ArgTyAlg Type -> Type -> Type
forall a. TyVar -> ArgTyAlg a -> Type -> a
argTyFold TyVar
argVar (ArgTyAlg Type -> Type -> Type) -> ArgTyAlg Type -> Type -> Type
forall a b. (a -> b) -> a -> b
$ ArgTyAlg :: forall a.
(Type -> a) -> a -> (Type -> a) -> (Type -> a -> a) -> ArgTyAlg a
ArgTyAlg
{ata_rec0 :: Type -> Type
ata_rec0 = Type -> Type
mkRec0, ata_par1 :: Type
ata_par1 = Type
mkPar1,
ata_rec1 :: Type -> Type
ata_rec1 = Type -> Type
mkRec1, ata_comp :: Type -> Type -> Type
ata_comp = TyCon -> Type -> Type -> Type -> Type
mkComp TyCon
comp Type
k}
tyConName_user :: Name
tyConName_user = case TyCon -> Maybe (TyCon, [Type])
tyConFamInst_maybe TyCon
tycon of
Just (TyCon
ptycon, [Type]
_) -> TyCon -> Name
tyConName TyCon
ptycon
Maybe (TyCon, [Type])
Nothing -> TyCon -> Name
tyConName TyCon
tycon
dtName :: Type
dtName = FastString -> Type
mkStrLitTy (FastString -> Type) -> (Name -> FastString) -> Name -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OccName -> FastString
occNameFS (OccName -> FastString) -> (Name -> OccName) -> Name -> FastString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> OccName
nameOccName (Name -> Type) -> Name -> Type
forall a b. (a -> b) -> a -> b
$ Name
tyConName_user
mdName :: Type
mdName = FastString -> Type
mkStrLitTy (FastString -> Type) -> (TyCon -> FastString) -> TyCon -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ModuleName -> FastString
moduleNameFS (ModuleName -> FastString)
-> (TyCon -> ModuleName) -> TyCon -> FastString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Module -> ModuleName
moduleName
(Module -> ModuleName) -> (TyCon -> Module) -> TyCon -> ModuleName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasDebugCallStack => Name -> Module
Name -> Module
nameModule (Name -> Module) -> (TyCon -> Name) -> TyCon -> Module
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyCon -> Name
tyConName (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ TyCon
tycon
pkgName :: Type
pkgName = FastString -> Type
mkStrLitTy (FastString -> Type) -> (TyCon -> FastString) -> TyCon -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnitId -> FastString
unitIdFS (UnitId -> FastString) -> (TyCon -> UnitId) -> TyCon -> FastString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Module -> UnitId
moduleUnitId
(Module -> UnitId) -> (TyCon -> Module) -> TyCon -> UnitId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasDebugCallStack => Name -> Module
Name -> Module
nameModule (Name -> Module) -> (TyCon -> Name) -> TyCon -> Module
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TyCon -> Name
tyConName (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ TyCon
tycon
isNT :: Type
isNT = TyCon -> Type
mkTyConTy (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ if TyCon -> Bool
isNewTyCon TyCon
tycon
then TyCon
promotedTrueDataCon
else TyCon
promotedFalseDataCon
ctName :: DataCon -> Type
ctName = FastString -> Type
mkStrLitTy (FastString -> Type) -> (DataCon -> FastString) -> DataCon -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OccName -> FastString
occNameFS (OccName -> FastString)
-> (DataCon -> OccName) -> DataCon -> FastString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> OccName
nameOccName (Name -> OccName) -> (DataCon -> Name) -> DataCon -> OccName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataCon -> Name
dataConName
ctFix :: DataCon -> Type
ctFix DataCon
c
| DataCon -> Bool
dataConIsInfix DataCon
c
= case FixityEnv -> Name -> Fixity
lookupFixity FixityEnv
fix_env (DataCon -> Name
dataConName DataCon
c) of
Fixity SourceText
_ US
n FixityDirection
InfixL -> US -> TyCon -> Type
buildFix US
n TyCon
pLA
Fixity SourceText
_ US
n FixityDirection
InfixR -> US -> TyCon -> Type
buildFix US
n TyCon
pRA
Fixity SourceText
_ US
n FixityDirection
InfixN -> US -> TyCon -> Type
buildFix US
n TyCon
pNA
| Bool
otherwise = TyCon -> Type
mkTyConTy TyCon
pPrefix
buildFix :: US -> TyCon -> Type
buildFix US
n TyCon
assoc = TyCon -> [Type] -> Type
mkTyConApp TyCon
pInfix [ TyCon -> Type
mkTyConTy TyCon
assoc
, Integer -> Type
mkNumLitTy (US -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral US
n)]
isRec :: DataCon -> Type
isRec DataCon
c = TyCon -> Type
mkTyConTy (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ if DataCon -> [FieldLabel]
dataConFieldLabels DataCon
c [FieldLabel] -> US -> Bool
forall a. [a] -> US -> Bool
`lengthExceeds` US
0
then TyCon
promotedTrueDataCon
else TyCon
promotedFalseDataCon
selName :: FieldLbl a -> Type
selName = FastString -> Type
mkStrLitTy (FastString -> Type)
-> (FieldLbl a -> FastString) -> FieldLbl a -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldLbl a -> FastString
forall a. FieldLbl a -> FastString
flLabel
mbSel :: Maybe (FieldLbl a) -> Type
mbSel Maybe (FieldLbl a)
Nothing = TyCon -> [Type] -> Type
mkTyConApp TyCon
promotedNothingDataCon [Type
typeSymbolKind]
mbSel (Just FieldLbl a
s) = TyCon -> [Type] -> Type
mkTyConApp TyCon
promotedJustDataCon
[Type
typeSymbolKind, FieldLbl a -> Type
forall a. FieldLbl a -> Type
selName FieldLbl a
s]
metaDataTy :: Type
metaDataTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
md [Type
dtName, Type
mdName, Type
pkgName, Type
isNT]
metaConsTy :: DataCon -> Type
metaConsTy DataCon
c = TyCon -> [Type] -> Type
mkTyConApp TyCon
mc [DataCon -> Type
ctName DataCon
c, DataCon -> Type
ctFix DataCon
c, DataCon -> Type
isRec DataCon
c]
metaSelTy :: Maybe FieldLabel
-> SrcUnpackedness -> SrcStrictness -> HsImplBang -> Type
metaSelTy Maybe FieldLabel
mlbl SrcUnpackedness
su SrcStrictness
ss HsImplBang
ib =
TyCon -> [Type] -> Type
mkTyConApp TyCon
ms [Maybe FieldLabel -> Type
forall a. Maybe (FieldLbl a) -> Type
mbSel Maybe FieldLabel
mlbl, Type
pSUpkness, Type
pSStrness, Type
pDStrness]
where
pSUpkness :: Type
pSUpkness = TyCon -> Type
mkTyConTy (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ case SrcUnpackedness
su of
SrcUnpackedness
SrcUnpack -> TyCon
pSUpk
SrcUnpackedness
SrcNoUnpack -> TyCon
pSNUpk
SrcUnpackedness
NoSrcUnpack -> TyCon
pNSUpkness
pSStrness :: Type
pSStrness = TyCon -> Type
mkTyConTy (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ case SrcStrictness
ss of
SrcStrictness
SrcLazy -> TyCon
pSLzy
SrcStrictness
SrcStrict -> TyCon
pSStr
SrcStrictness
NoSrcStrict -> TyCon
pNSStrness
pDStrness :: Type
pDStrness = TyCon -> Type
mkTyConTy (TyCon -> Type) -> TyCon -> Type
forall a b. (a -> b) -> a -> b
$ case HsImplBang
ib of
HsImplBang
HsLazy -> TyCon
pDLzy
HsImplBang
HsStrict -> TyCon
pDStr
HsUnpack{} -> TyCon
pDUpk
Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return (TyCon -> Type
mkD TyCon
tycon)
mkComp :: TyCon -> Kind -> Type -> Type -> Type
mkComp :: TyCon -> Type -> Type -> Type -> Type
mkComp TyCon
comp Type
k Type
f Type
g
| Bool
k1_first = TyCon -> [Type] -> Type
mkTyConApp TyCon
comp [Type
k,Type
liftedTypeKind,Type
f,Type
g]
| Bool
otherwise = TyCon -> [Type] -> Type
mkTyConApp TyCon
comp [Type
liftedTypeKind,Type
k,Type
f,Type
g]
where
k1_first :: Bool
k1_first = TyVar
k_first TyVar -> TyVar -> Bool
forall a. Eq a => a -> a -> Bool
== TyVar
p_kind_var
[TyVar
k_first,TyVar
_,TyVar
_,TyVar
_,TyVar
p] = TyCon -> [TyVar]
tyConTyVars TyCon
comp
Just TyVar
p_kind_var = Type -> Maybe TyVar
getTyVar_maybe (TyVar -> Type
tyVarKind TyVar
p)
mkBoxTy :: TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> Kind
-> Type
-> Type
mkBoxTy :: TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> TyCon
-> Type
-> Type
-> Type
mkBoxTy TyCon
uAddr TyCon
uChar TyCon
uDouble TyCon
uFloat TyCon
uInt TyCon
uWord TyCon
rec0 Type
k Type
ty
| Type
ty Type -> Type -> Bool
`eqType` Type
addrPrimTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
uAddr [Type
k]
| Type
ty Type -> Type -> Bool
`eqType` Type
charPrimTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
uChar [Type
k]
| Type
ty Type -> Type -> Bool
`eqType` Type
doublePrimTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
uDouble [Type
k]
| Type
ty Type -> Type -> Bool
`eqType` Type
floatPrimTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
uFloat [Type
k]
| Type
ty Type -> Type -> Bool
`eqType` Type
intPrimTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
uInt [Type
k]
| Type
ty Type -> Type -> Bool
`eqType` Type
wordPrimTy = TyCon -> [Type] -> Type
mkTyConApp TyCon
uWord [Type
k]
| Bool
otherwise = TyCon -> [Type] -> Type
mkTyConApp TyCon
rec0 [Type
k,Type
ty]
mkSum :: GenericKind_
-> US
-> [DataCon]
-> ([Alt],
[Alt])
mkSum :: GenericKind_ -> US -> [DataCon] -> ([Alt], [Alt])
mkSum GenericKind_
_ US
_ [] = ([(Located (Pat GhcPs), LHsExpr GhcPs)
Alt
from_alt], [(Located (Pat GhcPs), LHsExpr GhcPs)
Alt
to_alt])
where
from_alt :: (Located (Pat GhcPs), LHsExpr GhcPs)
from_alt = (Located (Pat GhcPs)
LPat GhcPs
x_Pat, LHsExpr GhcPs -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsExpr GhcPs
nlHsCase LHsExpr GhcPs
x_Expr [])
to_alt :: (Located (Pat GhcPs), LHsExpr GhcPs)
to_alt = (Located (Pat GhcPs)
LPat GhcPs
x_Pat, LHsExpr GhcPs -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsExpr GhcPs
nlHsCase LHsExpr GhcPs
x_Expr [])
mkSum GenericKind_
gk_ US
us [DataCon]
datacons =
[((Located (Pat GhcPs), LHsExpr GhcPs),
(Located (Pat GhcPs), LHsExpr GhcPs))]
-> ([(Located (Pat GhcPs), LHsExpr GhcPs)],
[(Located (Pat GhcPs), LHsExpr GhcPs)])
forall a b. [(a, b)] -> ([a], [b])
unzip [ GenericKind_DC -> US -> US -> US -> DataCon -> (Alt, Alt)
mk1Sum (GenericKind_ -> DataCon -> GenericKind_DC
gk2gkDC GenericKind_
gk_ DataCon
d) US
us US
i ([DataCon] -> US
forall (t :: * -> *) a. Foldable t => t a -> US
length [DataCon]
datacons) DataCon
d
| (DataCon
d,US
i) <- [DataCon] -> [US] -> [(DataCon, US)]
forall a b. [a] -> [b] -> [(a, b)]
zip [DataCon]
datacons [US
1..] ]
mk1Sum :: GenericKind_DC
-> US
-> Int
-> Int
-> DataCon
-> (Alt,
Alt)
mk1Sum :: GenericKind_DC -> US -> US -> US -> DataCon -> (Alt, Alt)
mk1Sum GenericKind_DC
gk_ US
us US
i US
n DataCon
datacon = ((Located (Pat GhcPs), LHsExpr GhcPs)
Alt
from_alt, (Located (Pat GhcPs), LHsExpr GhcPs)
Alt
to_alt)
where
gk :: GenericKind
gk = GenericKind_DC -> GenericKind
forgetArgVar GenericKind_DC
gk_
argTys :: [Type]
argTys = DataCon -> [Type]
dataConOrigArgTys DataCon
datacon
n_args :: US
n_args = DataCon -> US
dataConSourceArity DataCon
datacon
datacon_varTys :: [(RdrName, Type)]
datacon_varTys = [RdrName] -> [Type] -> [(RdrName, Type)]
forall a b. [a] -> [b] -> [(a, b)]
zip ((US -> RdrName) -> [US] -> [RdrName]
forall a b. (a -> b) -> [a] -> [b]
map US -> RdrName
mkGenericLocal [US
us .. US
usUS -> US -> US
forall a. Num a => a -> a -> a
+US
n_argsUS -> US -> US
forall a. Num a => a -> a -> a
-US
1]) [Type]
argTys
datacon_vars :: [RdrName]
datacon_vars = ((RdrName, Type) -> RdrName) -> [(RdrName, Type)] -> [RdrName]
forall a b. (a -> b) -> [a] -> [b]
map (RdrName, Type) -> RdrName
forall a b. (a, b) -> a
fst [(RdrName, Type)]
datacon_varTys
datacon_rdr :: RdrName
datacon_rdr = DataCon -> RdrName
forall thing. NamedThing thing => thing -> RdrName
getRdrName DataCon
datacon
from_alt :: (Located (Pat GhcPs), LHsExpr GhcPs)
from_alt = (RdrName -> [RdrName] -> LPat GhcPs
nlConVarPat RdrName
datacon_rdr [RdrName]
datacon_vars, LHsExpr GhcPs
from_alt_rhs)
from_alt_rhs :: LHsExpr GhcPs
from_alt_rhs = US -> US -> LHsExpr GhcPs -> LHsExpr GhcPs
genLR_E US
i US
n (GenericKind_DC -> [(RdrName, Type)] -> LHsExpr GhcPs
mkProd_E GenericKind_DC
gk_ [(RdrName, Type)]
datacon_varTys)
to_alt :: (Located (Pat GhcPs), LHsExpr GhcPs)
to_alt = ( US -> US -> LPat GhcPs -> LPat GhcPs
genLR_P US
i US
n (GenericKind -> [(RdrName, Type)] -> LPat GhcPs
mkProd_P GenericKind
gk [(RdrName, Type)]
datacon_varTys)
, LHsExpr GhcPs
to_alt_rhs
)
to_alt_rhs :: LHsExpr GhcPs
to_alt_rhs = case GenericKind_DC
gk_ of
GenericKind_DC
Gen0_DC -> IdP GhcPs -> [IdP GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsVarApps RdrName
IdP GhcPs
datacon_rdr [RdrName]
[IdP GhcPs]
datacon_vars
Gen1_DC TyVar
argVar -> IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
datacon_rdr ([LHsExpr GhcPs] -> LHsExpr GhcPs)
-> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ ((RdrName, Type) -> LHsExpr GhcPs)
-> [(RdrName, Type)] -> [LHsExpr GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map (RdrName, Type) -> LHsExpr GhcPs
argTo [(RdrName, Type)]
datacon_varTys
where
argTo :: (RdrName, Type) -> LHsExpr GhcPs
argTo (RdrName
var, Type
ty) = Type -> LHsExpr GhcPs
converter Type
ty LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
var where
converter :: Type -> LHsExpr GhcPs
converter = TyVar -> ArgTyAlg (LHsExpr GhcPs) -> Type -> LHsExpr GhcPs
forall a. TyVar -> ArgTyAlg a -> Type -> a
argTyFold TyVar
argVar (ArgTyAlg (LHsExpr GhcPs) -> Type -> LHsExpr GhcPs)
-> ArgTyAlg (LHsExpr GhcPs) -> Type -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ ArgTyAlg :: forall a.
(Type -> a) -> a -> (Type -> a) -> (Type -> a -> a) -> ArgTyAlg a
ArgTyAlg
{ata_rec0 :: Type -> LHsExpr GhcPs
ata_rec0 = RdrName -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar (RdrName -> LHsExpr GhcPs)
-> (Type -> RdrName) -> Type -> LHsExpr GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> RdrName
unboxRepRDR,
ata_par1 :: LHsExpr GhcPs
ata_par1 = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
unPar1_RDR,
ata_rec1 :: Type -> LHsExpr GhcPs
ata_rec1 = LHsExpr GhcPs -> Type -> LHsExpr GhcPs
forall a b. a -> b -> a
const (LHsExpr GhcPs -> Type -> LHsExpr GhcPs)
-> LHsExpr GhcPs -> Type -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
unRec1_RDR,
ata_comp :: Type -> LHsExpr GhcPs -> LHsExpr GhcPs
ata_comp = \Type
_ LHsExpr GhcPs
cnv -> (IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
fmap_RDR LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` LHsExpr GhcPs
cnv)
LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
`nlHsCompose` IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
unComp1_RDR}
genLR_P :: Int -> Int -> LPat GhcPs -> LPat GhcPs
genLR_P :: US -> US -> LPat GhcPs -> LPat GhcPs
genLR_P US
i US
n LPat GhcPs
p
| US
n US -> US -> Bool
forall a. Eq a => a -> a -> Bool
== US
0 = String -> Located (Pat GhcPs)
forall a. HasCallStack => String -> a
error String
"impossible"
| US
n US -> US -> Bool
forall a. Eq a => a -> a -> Bool
== US
1 = LPat GhcPs
p
| US
i US -> US -> Bool
forall a. Ord a => a -> a -> Bool
<= US -> US -> US
forall a. Integral a => a -> a -> a
div US
n US
2 = LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ RdrName -> [LPat GhcPs] -> LPat GhcPs
nlConPat RdrName
l1DataCon_RDR [US -> US -> LPat GhcPs -> LPat GhcPs
genLR_P US
i (US -> US -> US
forall a. Integral a => a -> a -> a
div US
n US
2) LPat GhcPs
p]
| Bool
otherwise = LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ RdrName -> [LPat GhcPs] -> LPat GhcPs
nlConPat RdrName
r1DataCon_RDR [US -> US -> LPat GhcPs -> LPat GhcPs
genLR_P (US
iUS -> US -> US
forall a. Num a => a -> a -> a
-US
m) (US
nUS -> US -> US
forall a. Num a => a -> a -> a
-US
m) LPat GhcPs
p]
where m :: US
m = US -> US -> US
forall a. Integral a => a -> a -> a
div US
n US
2
genLR_E :: Int -> Int -> LHsExpr GhcPs -> LHsExpr GhcPs
genLR_E :: US -> US -> LHsExpr GhcPs -> LHsExpr GhcPs
genLR_E US
i US
n LHsExpr GhcPs
e
| US
n US -> US -> Bool
forall a. Eq a => a -> a -> Bool
== US
0 = String -> LHsExpr GhcPs
forall a. HasCallStack => String -> a
error String
"impossible"
| US
n US -> US -> Bool
forall a. Eq a => a -> a -> Bool
== US
1 = LHsExpr GhcPs
e
| US
i US -> US -> Bool
forall a. Ord a => a -> a -> Bool
<= US -> US -> US
forall a. Integral a => a -> a -> a
div US
n US
2 = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
l1DataCon_RDR LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp`
LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar (US -> US -> LHsExpr GhcPs -> LHsExpr GhcPs
genLR_E US
i (US -> US -> US
forall a. Integral a => a -> a -> a
div US
n US
2) LHsExpr GhcPs
e)
| Bool
otherwise = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
r1DataCon_RDR LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp`
LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsPar (US -> US -> LHsExpr GhcPs -> LHsExpr GhcPs
genLR_E (US
iUS -> US -> US
forall a. Num a => a -> a -> a
-US
m) (US
nUS -> US -> US
forall a. Num a => a -> a -> a
-US
m) LHsExpr GhcPs
e)
where m :: US
m = US -> US -> US
forall a. Integral a => a -> a -> a
div US
n US
2
mkProd_E :: GenericKind_DC
-> [(RdrName, Type)]
-> LHsExpr GhcPs
mkProd_E :: GenericKind_DC -> [(RdrName, Type)] -> LHsExpr GhcPs
mkProd_E GenericKind_DC
gk_ [(RdrName, Type)]
varTys = LHsExpr GhcPs -> LHsExpr GhcPs
mkM1_E ((LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs)
-> LHsExpr GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall a. (a -> a -> a) -> a -> [a] -> a
foldBal LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
(IdP (GhcPass id) ~ RdrName) =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
prod (IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
u1DataCon_RDR) [LHsExpr GhcPs]
appVars)
where
appVars :: [LHsExpr GhcPs]
appVars = ((RdrName, Type) -> LHsExpr GhcPs)
-> [(RdrName, Type)] -> [LHsExpr GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map (GenericKind_DC -> (RdrName, Type) -> LHsExpr GhcPs
wrapArg_E GenericKind_DC
gk_) [(RdrName, Type)]
varTys
prod :: LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
prod LHsExpr (GhcPass id)
a LHsExpr (GhcPass id)
b = RdrName
IdP (GhcPass id)
prodDataCon_RDR IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
`nlHsApps` [LHsExpr (GhcPass id)
a,LHsExpr (GhcPass id)
b]
wrapArg_E :: GenericKind_DC -> (RdrName, Type) -> LHsExpr GhcPs
wrapArg_E :: GenericKind_DC -> (RdrName, Type) -> LHsExpr GhcPs
wrapArg_E GenericKind_DC
Gen0_DC (RdrName
var, Type
ty) = LHsExpr GhcPs -> LHsExpr GhcPs
mkM1_E (LHsExpr GhcPs -> LHsExpr GhcPs) -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$
Type -> RdrName
boxRepRDR Type
ty IdP GhcPs -> [IdP GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
`nlHsVarApps` [RdrName
IdP GhcPs
var]
wrapArg_E (Gen1_DC TyVar
argVar) (RdrName
var, Type
ty) = LHsExpr GhcPs -> LHsExpr GhcPs
mkM1_E (LHsExpr GhcPs -> LHsExpr GhcPs) -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$
Type -> LHsExpr GhcPs
converter Type
ty LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
var
where converter :: Type -> LHsExpr GhcPs
converter = TyVar -> ArgTyAlg (LHsExpr GhcPs) -> Type -> LHsExpr GhcPs
forall a. TyVar -> ArgTyAlg a -> Type -> a
argTyFold TyVar
argVar (ArgTyAlg (LHsExpr GhcPs) -> Type -> LHsExpr GhcPs)
-> ArgTyAlg (LHsExpr GhcPs) -> Type -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ ArgTyAlg :: forall a.
(Type -> a) -> a -> (Type -> a) -> (Type -> a -> a) -> ArgTyAlg a
ArgTyAlg
{ata_rec0 :: Type -> LHsExpr GhcPs
ata_rec0 = RdrName -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar (RdrName -> LHsExpr GhcPs)
-> (Type -> RdrName) -> Type -> LHsExpr GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> RdrName
boxRepRDR,
ata_par1 :: LHsExpr GhcPs
ata_par1 = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
par1DataCon_RDR,
ata_rec1 :: Type -> LHsExpr GhcPs
ata_rec1 = LHsExpr GhcPs -> Type -> LHsExpr GhcPs
forall a b. a -> b -> a
const (LHsExpr GhcPs -> Type -> LHsExpr GhcPs)
-> LHsExpr GhcPs -> Type -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
rec1DataCon_RDR,
ata_comp :: Type -> LHsExpr GhcPs -> LHsExpr GhcPs
ata_comp = \Type
_ LHsExpr GhcPs
cnv -> IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
comp1DataCon_RDR LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
`nlHsCompose`
(IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
fmap_RDR LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` LHsExpr GhcPs
cnv)}
boxRepRDR :: Type -> RdrName
boxRepRDR :: Type -> RdrName
boxRepRDR = RdrName
-> ((RdrName, RdrName) -> RdrName)
-> Maybe (RdrName, RdrName)
-> RdrName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe RdrName
k1DataCon_RDR (RdrName, RdrName) -> RdrName
forall a b. (a, b) -> a
fst (Maybe (RdrName, RdrName) -> RdrName)
-> (Type -> Maybe (RdrName, RdrName)) -> Type -> RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Maybe (RdrName, RdrName)
unboxedRepRDRs
unboxRepRDR :: Type -> RdrName
unboxRepRDR :: Type -> RdrName
unboxRepRDR = RdrName
-> ((RdrName, RdrName) -> RdrName)
-> Maybe (RdrName, RdrName)
-> RdrName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe RdrName
unK1_RDR (RdrName, RdrName) -> RdrName
forall a b. (a, b) -> b
snd (Maybe (RdrName, RdrName) -> RdrName)
-> (Type -> Maybe (RdrName, RdrName)) -> Type -> RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Maybe (RdrName, RdrName)
unboxedRepRDRs
unboxedRepRDRs :: Type -> Maybe (RdrName, RdrName)
unboxedRepRDRs :: Type -> Maybe (RdrName, RdrName)
unboxedRepRDRs Type
ty
| Type
ty Type -> Type -> Bool
`eqType` Type
addrPrimTy = (RdrName, RdrName) -> Maybe (RdrName, RdrName)
forall a. a -> Maybe a
Just (RdrName
uAddrDataCon_RDR, RdrName
uAddrHash_RDR)
| Type
ty Type -> Type -> Bool
`eqType` Type
charPrimTy = (RdrName, RdrName) -> Maybe (RdrName, RdrName)
forall a. a -> Maybe a
Just (RdrName
uCharDataCon_RDR, RdrName
uCharHash_RDR)
| Type
ty Type -> Type -> Bool
`eqType` Type
doublePrimTy = (RdrName, RdrName) -> Maybe (RdrName, RdrName)
forall a. a -> Maybe a
Just (RdrName
uDoubleDataCon_RDR, RdrName
uDoubleHash_RDR)
| Type
ty Type -> Type -> Bool
`eqType` Type
floatPrimTy = (RdrName, RdrName) -> Maybe (RdrName, RdrName)
forall a. a -> Maybe a
Just (RdrName
uFloatDataCon_RDR, RdrName
uFloatHash_RDR)
| Type
ty Type -> Type -> Bool
`eqType` Type
intPrimTy = (RdrName, RdrName) -> Maybe (RdrName, RdrName)
forall a. a -> Maybe a
Just (RdrName
uIntDataCon_RDR, RdrName
uIntHash_RDR)
| Type
ty Type -> Type -> Bool
`eqType` Type
wordPrimTy = (RdrName, RdrName) -> Maybe (RdrName, RdrName)
forall a. a -> Maybe a
Just (RdrName
uWordDataCon_RDR, RdrName
uWordHash_RDR)
| Bool
otherwise = Maybe (RdrName, RdrName)
forall a. Maybe a
Nothing
mkProd_P :: GenericKind
-> [(RdrName, Type)]
-> LPat GhcPs
mkProd_P :: GenericKind -> [(RdrName, Type)] -> LPat GhcPs
mkProd_P GenericKind
gk [(RdrName, Type)]
varTys = LPat GhcPs -> LPat GhcPs
mkM1_P ((Located (Pat GhcPs) -> Located (Pat GhcPs) -> Located (Pat GhcPs))
-> Located (Pat GhcPs)
-> [Located (Pat GhcPs)]
-> Located (Pat GhcPs)
forall a. (a -> a -> a) -> a -> [a] -> a
foldBal Located (Pat GhcPs) -> Located (Pat GhcPs) -> Located (Pat GhcPs)
prod (IdP GhcPs -> LPat GhcPs
forall (p :: Pass). IdP (GhcPass p) -> LPat (GhcPass p)
nlNullaryConPat RdrName
IdP GhcPs
u1DataCon_RDR) [Located (Pat GhcPs)]
appVars)
where
appVars :: [Located (Pat GhcPs)]
appVars = (RdrName -> Type -> Located (Pat GhcPs))
-> [(RdrName, Type)] -> [Located (Pat GhcPs)]
forall a b c. (a -> b -> c) -> [(a, b)] -> [c]
unzipWith (GenericKind -> RdrName -> Type -> LPat GhcPs
wrapArg_P GenericKind
gk) [(RdrName, Type)]
varTys
prod :: Located (Pat GhcPs) -> Located (Pat GhcPs) -> LPat GhcPs
prod Located (Pat GhcPs)
a Located (Pat GhcPs)
b = LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ RdrName
prodDataCon_RDR RdrName -> [LPat GhcPs] -> LPat GhcPs
`nlConPat` [Located (Pat GhcPs)
LPat GhcPs
a,Located (Pat GhcPs)
LPat GhcPs
b]
wrapArg_P :: GenericKind -> RdrName -> Type -> LPat GhcPs
wrapArg_P :: GenericKind -> RdrName -> Type -> LPat GhcPs
wrapArg_P GenericKind
Gen0 RdrName
v Type
ty = LPat GhcPs -> LPat GhcPs
mkM1_P (LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ Type -> RdrName
boxRepRDR Type
ty RdrName -> [RdrName] -> LPat GhcPs
`nlConVarPat` [RdrName
v])
wrapArg_P GenericKind
Gen1 RdrName
v Type
_ = LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ RdrName
m1DataCon_RDR RdrName -> [RdrName] -> LPat GhcPs
`nlConVarPat` [RdrName
v]
mkGenericLocal :: US -> RdrName
mkGenericLocal :: US -> RdrName
mkGenericLocal US
u = FastString -> RdrName
mkVarUnqual (String -> FastString
mkFastString (String
"g" String -> String -> String
forall a. [a] -> [a] -> [a]
++ US -> String
forall a. Show a => a -> String
show US
u))
x_RDR :: RdrName
x_RDR :: RdrName
x_RDR = FastString -> RdrName
mkVarUnqual (String -> FastString
fsLit String
"x")
x_Expr :: LHsExpr GhcPs
x_Expr :: LHsExpr GhcPs
x_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
x_RDR
x_Pat :: LPat GhcPs
x_Pat :: LPat GhcPs
x_Pat = IdP GhcPs -> LPat GhcPs
forall (p :: Pass). IdP (GhcPass p) -> LPat (GhcPass p)
nlVarPat RdrName
IdP GhcPs
x_RDR
mkM1_E :: LHsExpr GhcPs -> LHsExpr GhcPs
mkM1_E :: LHsExpr GhcPs -> LHsExpr GhcPs
mkM1_E LHsExpr GhcPs
e = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
m1DataCon_RDR LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` LHsExpr GhcPs
e
mkM1_P :: LPat GhcPs -> LPat GhcPs
mkM1_P :: LPat GhcPs -> LPat GhcPs
mkM1_P LPat GhcPs
p = LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ RdrName
m1DataCon_RDR RdrName -> [LPat GhcPs] -> LPat GhcPs
`nlConPat` [LPat GhcPs
p]
nlHsCompose :: LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
nlHsCompose :: LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
nlHsCompose LHsExpr GhcPs
x LHsExpr GhcPs
y = RdrName
IdP GhcPs
compose_RDR IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
`nlHsApps` [LHsExpr GhcPs
x, LHsExpr GhcPs
y]
foldBal :: (a -> a -> a) -> a -> [a] -> a
foldBal :: (a -> a -> a) -> a -> [a] -> a
foldBal a -> a -> a
_ a
x [] = a
x
foldBal a -> a -> a
_ a
_ [a
y] = a
y
foldBal a -> a -> a
op a
x [a]
l = let ([a]
a,[a]
b) = US -> [a] -> ([a], [a])
forall a. US -> [a] -> ([a], [a])
splitAt ([a] -> US
forall (t :: * -> *) a. Foldable t => t a -> US
length [a]
l US -> US -> US
forall a. Integral a => a -> a -> a
`div` US
2) [a]
l
in (a -> a -> a) -> a -> [a] -> a
forall a. (a -> a -> a) -> a -> [a] -> a
foldBal a -> a -> a
op a
x [a]
a a -> a -> a
`op` (a -> a -> a) -> a -> [a] -> a
forall a. (a -> a -> a) -> a -> [a] -> a
foldBal a -> a -> a
op a
x [a]
b