-- | Convert GADTs into normal data types.

module Fay.Compiler.GADT
  (convertGADT
  ) where

import           Language.Haskell.Exts hiding (name)

-- | Convert a GADT to a normal data type.
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 _ = []