{-# LANGUAGE CPP #-}

module FFICXX.Generate.Util.HaskellSrcExts where

import           Data.Maybe                          (maybeToList)
import           Data.List                           (foldl')
import           Language.Haskell.Exts        hiding (unit_tycon)
import qualified Language.Haskell.Exts               (unit_tycon)


unqual :: String  -> QName ()
unqual :: String -> QName ()
unqual = () -> Name () -> QName ()
forall l. l -> Name l -> QName l
UnQual () (Name () -> QName ()) -> (String -> Name ()) -> String -> QName ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> String -> Name ()
forall l. l -> String -> Name l
Ident ()

tycon :: String -> Type ()
tycon :: String -> Type ()
tycon = () -> QName () -> Type ()
forall l. l -> QName l -> Type l
TyCon () (QName () -> Type ()) -> (String -> QName ()) -> String -> Type ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> QName ()
unqual

tyapp :: Type () -> Type () -> Type ()
tyapp :: Type () -> Type () -> Type ()
tyapp = () -> Type () -> Type () -> Type ()
forall l. l -> Type l -> Type l -> Type l
TyApp ()

infixl 2 `tyapp`

tyfun :: Type () -> Type () -> Type ()
tyfun :: Type () -> Type () -> Type ()
tyfun = () -> Type () -> Type () -> Type ()
forall l. l -> Type l -> Type l -> Type l
TyFun ()

infixr 2 `tyfun`

tylist :: Type () -> Type ()
tylist :: Type () -> Type ()
tylist = () -> Type () -> Type ()
forall l. l -> Type l -> Type l
TyList ()

unit_tycon :: Type ()
unit_tycon :: Type ()
unit_tycon = () -> Type ()
forall l. l -> Type l
Language.Haskell.Exts.unit_tycon ()

conDecl :: String -> [Type ()] -> ConDecl ()
conDecl :: String -> [Type ()] -> ConDecl ()
conDecl String
n [Type ()]
ys = () -> Name () -> [Type ()] -> ConDecl ()
forall l. l -> Name l -> [Type l] -> ConDecl l
ConDecl () (() -> String -> Name ()
forall l. l -> String -> Name l
Ident () String
n) [Type ()]
ys

qualConDecl :: Maybe [TyVarBind ()]
-> Maybe (Context ()) -> ConDecl () -> QualConDecl ()
qualConDecl = ()
-> Maybe [TyVarBind ()]
-> Maybe (Context ())
-> ConDecl ()
-> QualConDecl ()
forall l.
l
-> Maybe [TyVarBind l]
-> Maybe (Context l)
-> ConDecl l
-> QualConDecl l
QualConDecl ()

recDecl :: String -> [FieldDecl ()] -> ConDecl ()
recDecl :: String -> [FieldDecl ()] -> ConDecl ()
recDecl String
n [FieldDecl ()]
rs = () -> Name () -> [FieldDecl ()] -> ConDecl ()
forall l. l -> Name l -> [FieldDecl l] -> ConDecl l
RecDecl () (() -> String -> Name ()
forall l. l -> String -> Name l
Ident () String
n) [FieldDecl ()]
rs

app' :: String -> String -> Exp ()
app' :: String -> String -> Exp ()
app' String
x String
y = () -> Exp () -> Exp () -> Exp ()
forall l. l -> Exp l -> Exp l -> Exp l
App () (String -> Exp ()
mkVar String
x) (String -> Exp ()
mkVar String
y)


lit :: Literal () -> Exp ()
lit :: Literal () -> Exp ()
lit = () -> Literal () -> Exp ()
forall l. l -> Literal l -> Exp l
Lit ()


mkVar :: String -> Exp ()
mkVar :: String -> Exp ()
mkVar = () -> QName () -> Exp ()
forall l. l -> QName l -> Exp l
Var () (QName () -> Exp ()) -> (String -> QName ()) -> String -> Exp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> QName ()
unqual

con :: String -> Exp ()
con :: String -> Exp ()
con = () -> QName () -> Exp ()
forall l. l -> QName l -> Exp l
Con () (QName () -> Exp ()) -> (String -> QName ()) -> String -> Exp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> QName ()
unqual

mkTVar :: String -> Type ()
mkTVar :: String -> Type ()
mkTVar = () -> Name () -> Type ()
forall l. l -> Name l -> Type l
TyVar () (Name () -> Type ()) -> (String -> Name ()) -> String -> Type ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> String -> Name ()
forall l. l -> String -> Name l
Ident ()

mkPVar :: String -> Pat ()
mkPVar :: String -> Pat ()
mkPVar = () -> Name () -> Pat ()
forall l. l -> Name l -> Pat l
PVar () (Name () -> Pat ()) -> (String -> Name ()) -> String -> Pat ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> String -> Name ()
forall l. l -> String -> Name l
Ident ()

mkIVar :: String -> ImportSpec ()
mkIVar :: String -> ImportSpec ()
mkIVar = () -> Name () -> ImportSpec ()
forall l. l -> Name l -> ImportSpec l
IVar () (Name () -> ImportSpec ())
-> (String -> Name ()) -> String -> ImportSpec ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> String -> Name ()
forall l. l -> String -> Name l
Ident ()

mkPVarSig :: String -> Type () -> Pat ()
mkPVarSig :: String -> Type () -> Pat ()
mkPVarSig String
n Type ()
typ = () -> Pat () -> Type () -> Pat ()
forall l. l -> Pat l -> Type l -> Pat l
PatTypeSig () (String -> Pat ()
mkPVar String
n) Type ()
typ

pbind :: Pat () -> Exp () -> Maybe (Binds ()) -> Decl ()
pbind :: Pat () -> Exp () -> Maybe (Binds ()) -> Decl ()
pbind Pat ()
pat Exp ()
e = () -> Pat () -> Rhs () -> Maybe (Binds ()) -> Decl ()
forall l. l -> Pat l -> Rhs l -> Maybe (Binds l) -> Decl l
PatBind () Pat ()
pat (() -> Exp () -> Rhs ()
forall l. l -> Exp l -> Rhs l
UnGuardedRhs () Exp ()
e)

pbind_ :: Pat () -> Exp () -> Decl ()
pbind_ :: Pat () -> Exp () -> Decl ()
pbind_ Pat ()
p Exp ()
e = Pat () -> Exp () -> Maybe (Binds ()) -> Decl ()
pbind Pat ()
p Exp ()
e Maybe (Binds ())
forall a. Maybe a
Nothing

mkTBind :: String -> TyVarBind ()
mkTBind :: String -> TyVarBind ()
mkTBind = () -> Name () -> TyVarBind ()
forall l. l -> Name l -> TyVarBind l
UnkindedVar () (Name () -> TyVarBind ())
-> (String -> Name ()) -> String -> TyVarBind ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> String -> Name ()
forall l. l -> String -> Name l
Ident ()

mkBind1 :: String -> [Pat ()] -> Exp () -> Maybe (Binds ()) -> Decl ()
mkBind1 :: String -> [Pat ()] -> Exp () -> Maybe (Binds ()) -> Decl ()
mkBind1 String
n [Pat ()]
pat Exp ()
rhs Maybe (Binds ())
mbinds =
  () -> [Match ()] -> Decl ()
forall l. l -> [Match l] -> Decl l
FunBind () [ () -> Name () -> [Pat ()] -> Rhs () -> Maybe (Binds ()) -> Match ()
forall l.
l -> Name l -> [Pat l] -> Rhs l -> Maybe (Binds l) -> Match l
Match () (() -> String -> Name ()
forall l. l -> String -> Name l
Ident () String
n) [Pat ()]
pat (() -> Exp () -> Rhs ()
forall l. l -> Exp l -> Rhs l
UnGuardedRhs () Exp ()
rhs) Maybe (Binds ())
mbinds ]

mkFun :: String -> Type () -> [Pat ()] -> Exp () -> Maybe (Binds ()) -> [Decl ()]
mkFun :: String
-> Type () -> [Pat ()] -> Exp () -> Maybe (Binds ()) -> [Decl ()]
mkFun String
fname Type ()
typ [Pat ()]
pats Exp ()
rhs Maybe (Binds ())
mbinds = [String -> Type () -> Decl ()
mkFunSig String
fname Type ()
typ, String -> [Pat ()] -> Exp () -> Maybe (Binds ()) -> Decl ()
mkBind1 String
fname [Pat ()]
pats Exp ()
rhs Maybe (Binds ())
mbinds]

mkFunSig :: String -> Type () -> Decl ()
mkFunSig :: String -> Type () -> Decl ()
mkFunSig String
fname Type ()
typ = () -> [Name ()] -> Type () -> Decl ()
forall l. l -> [Name l] -> Type l -> Decl l
TypeSig () [() -> String -> Name ()
forall l. l -> String -> Name l
Ident () String
fname] Type ()
typ

mkClass :: Context () -> String -> [TyVarBind ()] -> [ClassDecl ()] -> Decl ()
mkClass :: Context () -> String -> [TyVarBind ()] -> [ClassDecl ()] -> Decl ()
mkClass Context ()
ctxt String
n [TyVarBind ()]
tbinds [ClassDecl ()]
cdecls = ()
-> Maybe (Context ())
-> DeclHead ()
-> [FunDep ()]
-> Maybe [ClassDecl ()]
-> Decl ()
forall l.
l
-> Maybe (Context l)
-> DeclHead l
-> [FunDep l]
-> Maybe [ClassDecl l]
-> Decl l
ClassDecl () (Context () -> Maybe (Context ())
forall a. a -> Maybe a
Just Context ()
ctxt) (String -> [TyVarBind ()] -> DeclHead ()
mkDeclHead String
n [TyVarBind ()]
tbinds)  [] ([ClassDecl ()] -> Maybe [ClassDecl ()]
forall a. a -> Maybe a
Just [ClassDecl ()]
cdecls)


dhead :: String -> DeclHead ()
dhead :: String -> DeclHead ()
dhead String
n = () -> Name () -> DeclHead ()
forall l. l -> Name l -> DeclHead l
DHead () (() -> String -> Name ()
forall l. l -> String -> Name l
Ident () String
n)

mkDeclHead :: String -> [TyVarBind ()] -> DeclHead ()
mkDeclHead :: String -> [TyVarBind ()] -> DeclHead ()
mkDeclHead String
n [TyVarBind ()]
tbinds = (DeclHead () -> TyVarBind () -> DeclHead ())
-> DeclHead () -> [TyVarBind ()] -> DeclHead ()
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (() -> DeclHead () -> TyVarBind () -> DeclHead ()
forall l. l -> DeclHead l -> TyVarBind l -> DeclHead l
DHApp ()) (String -> DeclHead ()
dhead String
n) [TyVarBind ()]
tbinds

mkInstance :: Context () -> String -> [Type ()] -> [InstDecl ()] -> Decl ()
mkInstance :: Context () -> String -> [Type ()] -> [InstDecl ()] -> Decl ()
mkInstance Context ()
ctxt String
n [Type ()]
typs [InstDecl ()]
idecls = ()
-> Maybe (Overlap ())
-> InstRule ()
-> Maybe [InstDecl ()]
-> Decl ()
forall l.
l
-> Maybe (Overlap l) -> InstRule l -> Maybe [InstDecl l] -> Decl l
InstDecl () Maybe (Overlap ())
forall a. Maybe a
Nothing InstRule ()
instrule ([InstDecl ()] -> Maybe [InstDecl ()]
forall a. a -> Maybe a
Just [InstDecl ()]
idecls)
  where instrule :: InstRule ()
instrule = ()
-> Maybe [TyVarBind ()]
-> Maybe (Context ())
-> InstHead ()
-> InstRule ()
forall l.
l
-> Maybe [TyVarBind l]
-> Maybe (Context l)
-> InstHead l
-> InstRule l
IRule () Maybe [TyVarBind ()]
forall a. Maybe a
Nothing (Context () -> Maybe (Context ())
forall a. a -> Maybe a
Just Context ()
ctxt) InstHead ()
insthead
        insthead :: InstHead ()
insthead  = (InstHead () -> Type () -> InstHead ())
-> InstHead () -> [Type ()] -> InstHead ()
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' InstHead () -> Type () -> InstHead ()
f (() -> QName () -> InstHead ()
forall l. l -> QName l -> InstHead l
IHCon () (String -> QName ()
unqual String
n)) [Type ()]
typs
          where f :: InstHead () -> Type () -> InstHead ()
f InstHead ()
acc Type ()
x = () -> InstHead () -> Type () -> InstHead ()
forall l. l -> InstHead l -> Type l -> InstHead l
IHApp () InstHead ()
acc (Type () -> Type ()
tyParen Type ()
x)

mkData :: String -> [TyVarBind ()] -> [QualConDecl ()] -> Maybe (Deriving ()) -> Decl ()
#if MIN_VERSION_haskell_src_exts(1,20,0)
mkData :: String
-> [TyVarBind ()]
-> [QualConDecl ()]
-> Maybe (Deriving ())
-> Decl ()
mkData String
n [TyVarBind ()]
tbinds [QualConDecl ()]
qdecls Maybe (Deriving ())
mderiv  = ()
-> DataOrNew ()
-> Maybe (Context ())
-> DeclHead ()
-> [QualConDecl ()]
-> [Deriving ()]
-> Decl ()
forall l.
l
-> DataOrNew l
-> Maybe (Context l)
-> DeclHead l
-> [QualConDecl l]
-> [Deriving l]
-> Decl l
DataDecl () (() -> DataOrNew ()
forall l. l -> DataOrNew l
DataType ()) Maybe (Context ())
forall a. Maybe a
Nothing DeclHead ()
declhead [QualConDecl ()]
qdecls (Maybe (Deriving ()) -> [Deriving ()]
forall a. Maybe a -> [a]
maybeToList Maybe (Deriving ())
mderiv)
#else
mkData n tbinds qdecls mderiv  = DataDecl () (DataType ()) Nothing declhead qdecls mderiv
#endif
  where declhead :: DeclHead ()
declhead = String -> [TyVarBind ()] -> DeclHead ()
mkDeclHead String
n [TyVarBind ()]
tbinds

mkNewtype :: String -> [TyVarBind ()] -> [QualConDecl ()] -> Maybe (Deriving ()) -> Decl ()
#if MIN_VERSION_haskell_src_exts(1,20,0)
mkNewtype :: String
-> [TyVarBind ()]
-> [QualConDecl ()]
-> Maybe (Deriving ())
-> Decl ()
mkNewtype String
n [TyVarBind ()]
tbinds [QualConDecl ()]
qdecls Maybe (Deriving ())
mderiv  = ()
-> DataOrNew ()
-> Maybe (Context ())
-> DeclHead ()
-> [QualConDecl ()]
-> [Deriving ()]
-> Decl ()
forall l.
l
-> DataOrNew l
-> Maybe (Context l)
-> DeclHead l
-> [QualConDecl l]
-> [Deriving l]
-> Decl l
DataDecl () (() -> DataOrNew ()
forall l. l -> DataOrNew l
NewType ()) Maybe (Context ())
forall a. Maybe a
Nothing DeclHead ()
declhead [QualConDecl ()]
qdecls (Maybe (Deriving ()) -> [Deriving ()]
forall a. Maybe a -> [a]
maybeToList Maybe (Deriving ())
mderiv)
#else
mkNewtype n tbinds qdecls mderiv  = DataDecl () (NewType ()) Nothing declhead qdecls mderiv
#endif
  where declhead :: DeclHead ()
declhead = String -> [TyVarBind ()] -> DeclHead ()
mkDeclHead String
n [TyVarBind ()]
tbinds

mkForImpCcall :: String -> String -> Type () -> Decl ()
mkForImpCcall :: String -> String -> Type () -> Decl ()
mkForImpCcall String
quote String
n Type ()
typ = ()
-> CallConv ()
-> Maybe (Safety ())
-> Maybe String
-> Name ()
-> Type ()
-> Decl ()
forall l.
l
-> CallConv l
-> Maybe (Safety l)
-> Maybe String
-> Name l
-> Type l
-> Decl l
ForImp () (() -> CallConv ()
forall l. l -> CallConv l
CCall ()) (Safety () -> Maybe (Safety ())
forall a. a -> Maybe a
Just (() -> Bool -> Safety ()
forall l. l -> Bool -> Safety l
PlaySafe () Bool
False)) (String -> Maybe String
forall a. a -> Maybe a
Just String
quote) (() -> String -> Name ()
forall l. l -> String -> Name l
Ident () String
n) Type ()
typ

mkModule :: String -> [ModulePragma ()] -> [ImportDecl ()] -> [Decl ()] -> Module ()
mkModule :: String
-> [ModulePragma ()] -> [ImportDecl ()] -> [Decl ()] -> Module ()
mkModule String
n [ModulePragma ()]
pragmas [ImportDecl ()]
idecls [Decl ()]
decls = ()
-> Maybe (ModuleHead ())
-> [ModulePragma ()]
-> [ImportDecl ()]
-> [Decl ()]
-> Module ()
forall l.
l
-> Maybe (ModuleHead l)
-> [ModulePragma l]
-> [ImportDecl l]
-> [Decl l]
-> Module l
Module () (ModuleHead () -> Maybe (ModuleHead ())
forall a. a -> Maybe a
Just ModuleHead ()
mhead) [ModulePragma ()]
pragmas [ImportDecl ()]
idecls [Decl ()]
decls
  where mhead :: ModuleHead ()
mhead = ()
-> ModuleName ()
-> Maybe (WarningText ())
-> Maybe (ExportSpecList ())
-> ModuleHead ()
forall l.
l
-> ModuleName l
-> Maybe (WarningText l)
-> Maybe (ExportSpecList l)
-> ModuleHead l
ModuleHead () (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () String
n) Maybe (WarningText ())
forall a. Maybe a
Nothing Maybe (ExportSpecList ())
forall a. Maybe a
Nothing

mkModuleE :: String -> [ModulePragma ()] -> [ExportSpec ()] -> [ImportDecl ()] -> [Decl ()] -> Module ()
mkModuleE :: String
-> [ModulePragma ()]
-> [ExportSpec ()]
-> [ImportDecl ()]
-> [Decl ()]
-> Module ()
mkModuleE String
n [ModulePragma ()]
pragmas [ExportSpec ()]
exps [ImportDecl ()]
idecls [Decl ()]
decls = ()
-> Maybe (ModuleHead ())
-> [ModulePragma ()]
-> [ImportDecl ()]
-> [Decl ()]
-> Module ()
forall l.
l
-> Maybe (ModuleHead l)
-> [ModulePragma l]
-> [ImportDecl l]
-> [Decl l]
-> Module l
Module () (ModuleHead () -> Maybe (ModuleHead ())
forall a. a -> Maybe a
Just ModuleHead ()
mhead) [ModulePragma ()]
pragmas  [ImportDecl ()]
idecls [Decl ()]
decls
  where mhead :: ModuleHead ()
mhead = ()
-> ModuleName ()
-> Maybe (WarningText ())
-> Maybe (ExportSpecList ())
-> ModuleHead ()
forall l.
l
-> ModuleName l
-> Maybe (WarningText l)
-> Maybe (ExportSpecList l)
-> ModuleHead l
ModuleHead () (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () String
n) Maybe (WarningText ())
forall a. Maybe a
Nothing (ExportSpecList () -> Maybe (ExportSpecList ())
forall a. a -> Maybe a
Just ExportSpecList ()
eslist)
        eslist :: ExportSpecList ()
eslist = () -> [ExportSpec ()] -> ExportSpecList ()
forall l. l -> [ExportSpec l] -> ExportSpecList l
ExportSpecList () [ExportSpec ()]
exps

mkImport :: String -> ImportDecl ()
mkImport :: String -> ImportDecl ()
mkImport String
m = ()
-> ModuleName ()
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe (ModuleName ())
-> Maybe (ImportSpecList ())
-> ImportDecl ()
forall l.
l
-> ModuleName l
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe (ModuleName l)
-> Maybe (ImportSpecList l)
-> ImportDecl l
ImportDecl () (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () String
m) Bool
False Bool
False Bool
False Maybe String
forall a. Maybe a
Nothing Maybe (ModuleName ())
forall a. Maybe a
Nothing Maybe (ImportSpecList ())
forall a. Maybe a
Nothing

mkImportExp :: String -> [String] -> ImportDecl ()
mkImportExp :: String -> [String] -> ImportDecl ()
mkImportExp String
m [String]
lst =
  ()
-> ModuleName ()
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe (ModuleName ())
-> Maybe (ImportSpecList ())
-> ImportDecl ()
forall l.
l
-> ModuleName l
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe (ModuleName l)
-> Maybe (ImportSpecList l)
-> ImportDecl l
ImportDecl () (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () String
m) Bool
False Bool
False Bool
False Maybe String
forall a. Maybe a
Nothing Maybe (ModuleName ())
forall a. Maybe a
Nothing (ImportSpecList () -> Maybe (ImportSpecList ())
forall a. a -> Maybe a
Just ImportSpecList ()
islist)
  where islist :: ImportSpecList ()
islist = () -> Bool -> [ImportSpec ()] -> ImportSpecList ()
forall l. l -> Bool -> [ImportSpec l] -> ImportSpecList l
ImportSpecList () Bool
False ((String -> ImportSpec ()) -> [String] -> [ImportSpec ()]
forall a b. (a -> b) -> [a] -> [b]
map String -> ImportSpec ()
mkIVar [String]
lst)


mkImportSrc :: String -> ImportDecl ()
mkImportSrc :: String -> ImportDecl ()
mkImportSrc String
m = ()
-> ModuleName ()
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe (ModuleName ())
-> Maybe (ImportSpecList ())
-> ImportDecl ()
forall l.
l
-> ModuleName l
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe (ModuleName l)
-> Maybe (ImportSpecList l)
-> ImportDecl l
ImportDecl () (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () String
m) Bool
False Bool
True Bool
False Maybe String
forall a. Maybe a
Nothing Maybe (ModuleName ())
forall a. Maybe a
Nothing Maybe (ImportSpecList ())
forall a. Maybe a
Nothing

lang :: [String] -> ModulePragma ()
lang :: [String] -> ModulePragma ()
lang [String]
ns = () -> [Name ()] -> ModulePragma ()
forall l. l -> [Name l] -> ModulePragma l
LanguagePragma () ((String -> Name ()) -> [String] -> [Name ()]
forall a b. (a -> b) -> [a] -> [b]
map (() -> String -> Name ()
forall l. l -> String -> Name l
Ident ()) [String]
ns)

dot :: Exp () -> Exp () -> Exp ()
Exp ()
x dot :: Exp () -> Exp () -> Exp ()
`dot` Exp ()
y = Exp ()
x Exp () -> Exp () -> Exp ()
`app` String -> Exp ()
mkVar String
"." Exp () -> Exp () -> Exp ()
`app` Exp ()
y

tyForall :: Maybe [TyVarBind ()] -> Maybe (Context ()) -> Type () -> Type ()
tyForall = ()
-> Maybe [TyVarBind ()] -> Maybe (Context ()) -> Type () -> Type ()
forall l.
l -> Maybe [TyVarBind l] -> Maybe (Context l) -> Type l -> Type l
TyForall ()

tyParen :: Type () -> Type ()
tyParen = () -> Type () -> Type ()
forall l. l -> Type l -> Type l
TyParen ()

tyPtr :: Type ()
tyPtr :: Type ()
tyPtr = String -> Type ()
tycon String
"Ptr"

tyForeignPtr :: Type ()
tyForeignPtr :: Type ()
tyForeignPtr = String -> Type ()
tycon String
"ForeignPtr"

classA :: QName () -> [Type ()] -> Asst ()
#if MIN_VERSION_haskell_src_exts(1,22,0)
classA :: QName () -> [Type ()] -> Asst ()
classA QName ()
n = () -> Type () -> Asst ()
forall l. l -> Type l -> Asst l
TypeA () (Type () -> Asst ())
-> ([Type ()] -> Type ()) -> [Type ()] -> Asst ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Type () -> Type () -> Type ()) -> Type () -> [Type ()] -> Type ()
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Type () -> Type () -> Type ()
tyapp (() -> QName () -> Type ()
forall l. l -> QName l -> Type l
TyCon () QName ()
n)
#else
classA = ClassA ()
#endif

cxEmpty :: Context ()
cxEmpty :: Context ()
cxEmpty = () -> Context ()
forall l. l -> Context l
CxEmpty ()

cxTuple :: [Asst ()] -> Context ()
cxTuple :: [Asst ()] -> Context ()
cxTuple = () -> [Asst ()] -> Context ()
forall l. l -> [Asst l] -> Context l
CxTuple ()

tySplice :: Splice () -> Type ()
tySplice :: Splice () -> Type ()
tySplice = () -> Splice () -> Type ()
forall l. l -> Splice l -> Type l
TySplice ()

parenSplice :: Exp () -> Splice ()
parenSplice :: Exp () -> Splice ()
parenSplice = () -> Exp () -> Splice ()
forall l. l -> Exp l -> Splice l
ParenSplice ()

bracketExp :: Bracket () -> Exp ()
bracketExp = () -> Bracket () -> Exp ()
forall l. l -> Bracket l -> Exp l
BracketExp ()
typeBracket :: Type () -> Bracket ()
typeBracket = () -> Type () -> Bracket ()
forall l. l -> Type l -> Bracket l
TypeBracket ()


#if MIN_VERSION_haskell_src_exts(1,20,0)
mkDeriving :: [InstRule ()] -> Deriving ()
mkDeriving = () -> Maybe (DerivStrategy ()) -> [InstRule ()] -> Deriving ()
forall l.
l -> Maybe (DerivStrategy l) -> [InstRule l] -> Deriving l
Deriving () Maybe (DerivStrategy ())
forall a. Maybe a
Nothing
#else
mkDeriving = Deriving ()
#endif

irule :: Maybe [TyVarBind ()]
-> Maybe (Context ()) -> InstHead () -> InstRule ()
irule = ()
-> Maybe [TyVarBind ()]
-> Maybe (Context ())
-> InstHead ()
-> InstRule ()
forall l.
l
-> Maybe [TyVarBind l]
-> Maybe (Context l)
-> InstHead l
-> InstRule l
IRule ()

ihcon :: QName () -> InstHead ()
ihcon = () -> QName () -> InstHead ()
forall l. l -> QName l -> InstHead l
IHCon ()

evar :: QName () -> ExportSpec ()
evar = () -> QName () -> ExportSpec ()
forall l. l -> QName l -> ExportSpec l
EVar ()
eabs :: Namespace () -> QName () -> ExportSpec ()
eabs = () -> Namespace () -> QName () -> ExportSpec ()
forall l. l -> Namespace l -> QName l -> ExportSpec l
EAbs ()
ethingwith :: EWildcard () -> QName () -> [CName ()] -> ExportSpec ()
ethingwith = () -> EWildcard () -> QName () -> [CName ()] -> ExportSpec ()
forall l. l -> EWildcard l -> QName l -> [CName l] -> ExportSpec l
EThingWith ()

ethingall :: QName () -> ExportSpec ()
ethingall QName ()
q = EWildcard () -> QName () -> [CName ()] -> ExportSpec ()
ethingwith (() -> Int -> EWildcard ()
forall l. l -> Int -> EWildcard l
EWildcard () Int
0) QName ()
q []

emodule :: String -> ExportSpec ()
emodule String
nm = () -> ModuleName () -> ExportSpec ()
forall l. l -> ModuleName l -> ExportSpec l
EModuleContents () (() -> String -> ModuleName ()
forall l. l -> String -> ModuleName l
ModuleName () String
nm)

nonamespace :: Namespace ()
nonamespace = () -> Namespace ()
forall l. l -> Namespace l
NoNamespace ()

insType :: Type () -> Type () -> InstDecl ()
insType = () -> Type () -> Type () -> InstDecl ()
forall l. l -> Type l -> Type l -> InstDecl l
InsType ()

insDecl :: Decl () -> InstDecl ()
insDecl = () -> Decl () -> InstDecl ()
forall l. l -> Decl l -> InstDecl l
InsDecl ()

generator :: Pat () -> Exp () -> Stmt ()
generator = () -> Pat () -> Exp () -> Stmt ()
forall l. l -> Pat l -> Exp l -> Stmt l
Generator ()

qualifier :: Exp () -> Stmt ()
qualifier = () -> Exp () -> Stmt ()
forall l. l -> Exp l -> Stmt l
Qualifier ()

clsDecl :: Decl () -> ClassDecl ()
clsDecl = () -> Decl () -> ClassDecl ()
forall l. l -> Decl l -> ClassDecl l
ClsDecl ()


unkindedVar :: Name () -> TyVarBind ()
unkindedVar = () -> Name () -> TyVarBind ()
forall l. l -> Name l -> TyVarBind l
UnkindedVar ()

op :: String -> QOp ()
op = () -> QName () -> QOp ()
forall l. l -> QName l -> QOp l
QVarOp () (QName () -> QOp ()) -> (String -> QName ()) -> String -> QOp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> Name () -> QName ()
forall l. l -> Name l -> QName l
UnQual () (Name () -> QName ()) -> (String -> Name ()) -> String -> QName ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> String -> Name ()
forall l. l -> String -> Name l
Symbol ()

inapp :: Exp () -> QOp () -> Exp () -> Exp ()
inapp = () -> Exp () -> QOp () -> Exp () -> Exp ()
forall l. l -> Exp l -> QOp l -> Exp l -> Exp l
InfixApp ()

if_ :: Exp () -> Exp () -> Exp () -> Exp ()
if_ = () -> Exp () -> Exp () -> Exp () -> Exp ()
forall l. l -> Exp l -> Exp l -> Exp l -> Exp l
If ()

urhs :: Exp () -> Rhs ()
urhs = () -> Exp () -> Rhs ()
forall l. l -> Exp l -> Rhs l
UnGuardedRhs ()

-- case pattern match p -> e
match :: Pat () -> Exp () -> Alt ()
match Pat ()
p Exp ()
e = () -> Pat () -> Rhs () -> Maybe (Binds ()) -> Alt ()
forall l. l -> Pat l -> Rhs l -> Maybe (Binds l) -> Alt l
Alt () Pat ()
p (Exp () -> Rhs ()
urhs Exp ()
e) Maybe (Binds ())
forall a. Maybe a
Nothing