packages feed

polyglot-0.1.1.0: src/SyntaxTrees/Haskell/ModuleDef.hs

module SyntaxTrees.Haskell.ModuleDef where

import SyntaxTrees.Haskell.ClassDef (ClassDef, DerivingDef, InstanceDef)
import SyntaxTrees.Haskell.Common   (Module, Var, VarOp)
import SyntaxTrees.Haskell.DataDef  (DataDef, NewTypeDef, TypeDef)
import SyntaxTrees.Haskell.FnDef    (FnDefOrSig, InfixFnAnnotation)
import SyntaxTrees.Haskell.Type     (TypeVar)


data ModuleDef
  = ModuleDef
      { name    :: Module
      , export  :: Maybe ModuleExport
      , imports :: [ModuleImport]
      , defs    :: [InternalDef]
      }
  deriving (Show)

newtype ModuleExport
  = ModuleExport [ModuleExportDef]
  deriving (Show)

data ModuleExportDef
  = ModuleExportDef ImportExportDef
  | FullModuleExport Module
  deriving (Show)

data ModuleImport
  = ModuleImport
      { qualified  :: Bool
      , module'    :: Module
      , alias      :: Maybe Module
      , hiding     :: Bool
      , importDefs :: [ModuleImportDef]
      }
  deriving (Show)

data ModuleImportDef
  = ModuleImportDef ImportExportDef
  deriving (Show)

data ImportExportDef
  = Member ModuleMember
  | FullData TypeVar
  | FilteredData TypeVar [ModuleMember]
  deriving (Show)

data ModuleMember
  = VarMember Var
  | VarOpMember VarOp
  | DataMember TypeVar
  deriving (Show)

data InternalDef
  = TypeDef' TypeDef
  | NewTypeDef' NewTypeDef
  | DataDef' DataDef
  | FnDefOrSig' FnDefOrSig
  | ClassDef' ClassDef
  | InstanceDef' InstanceDef
  | DerivingDef' DerivingDef
  | InfixFnAnnotation' InfixFnAnnotation
  deriving (Show)