module Fay.Compiler.GADT
(convertGADT
) where
import Language.Haskell.Exts hiding (name)
convertGADT :: GadtDecl a -> QualConDecl a
convertGADT :: GadtDecl a -> QualConDecl a
convertGADT d :: GadtDecl a
d = case GadtDecl a
d of
GadtDecl s :: a
s name :: Name a
name tyvars :: Maybe [TyVarBind a]
tyvars context :: Maybe (Context a)
context Nothing typ :: Type a
typ ->
a
-> Maybe [TyVarBind a]
-> Maybe (Context a)
-> ConDecl a
-> QualConDecl a
forall l.
l
-> Maybe [TyVarBind l]
-> Maybe (Context l)
-> ConDecl l
-> QualConDecl l
QualConDecl a
s Maybe [TyVarBind a]
tyvars Maybe (Context a)
context (a -> Name a -> [Type a] -> ConDecl a
forall l. l -> Name l -> [Type l] -> ConDecl l
ConDecl a
s Name a
name (Type a -> [Type a]
forall a. Type a -> [Type a]
convertFunc Type a
typ))
GadtDecl s :: a
s name :: Name a
name tyvars :: Maybe [TyVarBind a]
tyvars context :: Maybe (Context a)
context (Just fs :: [FieldDecl a]
fs) _typ :: Type a
_typ ->
a
-> Maybe [TyVarBind a]
-> Maybe (Context a)
-> ConDecl a
-> QualConDecl a
forall l.
l
-> Maybe [TyVarBind l]
-> Maybe (Context l)
-> ConDecl l
-> QualConDecl l
QualConDecl a
s Maybe [TyVarBind a]
tyvars Maybe (Context a)
context (a -> Name a -> [FieldDecl a] -> ConDecl a
forall l. l -> Name l -> [FieldDecl l] -> ConDecl l
RecDecl a
s Name a
name [FieldDecl a]
fs)
where
convertFunc :: Type a -> [Type a]
convertFunc :: Type a -> [Type a]
convertFunc (TyCon _ _) = []
convertFunc (TyFun _ x :: Type a
x xs :: Type a
xs) = Type a
x Type a -> [Type a] -> [Type a]
forall a. a -> [a] -> [a]
: Type a -> [Type a]
forall a. Type a -> [Type a]
convertFunc Type a
xs
convertFunc (TyParen _ x :: Type a
x) = Type a -> [Type a]
forall a. Type a -> [Type a]
convertFunc Type a
x
convertFunc _ = []