{- |
    Module      :  $Header$
    Description :  Code generators
    Copyright   :  (c) 2011        Björn Peemöller
                       2017        Finn Teegen
                       2018        Kai-Oliver Prott
    License     :  BSD-3-clause

    Maintainer  :  fte@informatik.uni-kiel.de
    Stability   :  experimental
    Portability :  portable

    This module subsumes the different code generators.
-}
module Generators where

import qualified Curry.AbstractCurry            as AC   (CurryProg)
import qualified Curry.FlatCurry.Type           as FC   (Prog, TypeExpr)
import qualified Curry.FlatCurry.Annotated.Type as AFC  (AProg)
import qualified Curry.FlatCurry.Typed.Type     as TFC  (TProg)
import qualified Curry.Syntax                   as CS   (Module)

import qualified Generators.GenAbstractCurry    as GAC  (genAbstractCurry)
import qualified Generators.GenFlatCurry        as GFC  ( genFlatCurry
                                                        , genFlatInterface
                                                        )
import qualified Generators.GenAnnotatedFlatCurry
                                                as GAFC (genAnnotatedFlatCurry)
import qualified Generators.GenTypedFlatCurry   as GTFC (genTypedFlatCurry)

import           Base.Types                             (Type, PredType)

import           CompilerEnv                            (CompilerEnv (..))
import qualified IL                                     (Module)

-- |Generate typed AbstractCurry
genTypedAbstractCurry :: CompilerEnv -> CS.Module PredType -> AC.CurryProg
genTypedAbstractCurry :: CompilerEnv -> Module PredType -> CurryProg
genTypedAbstractCurry = Bool -> CompilerEnv -> Module PredType -> CurryProg
GAC.genAbstractCurry Bool
False

-- |Generate untyped AbstractCurry
genUntypedAbstractCurry :: CompilerEnv -> CS.Module PredType -> AC.CurryProg
genUntypedAbstractCurry :: CompilerEnv -> Module PredType -> CurryProg
genUntypedAbstractCurry = Bool -> CompilerEnv -> Module PredType -> CurryProg
GAC.genAbstractCurry Bool
True

-- |Generate typed FlatCurry
genTypedFlatCurry :: AFC.AProg FC.TypeExpr -> TFC.TProg
genTypedFlatCurry :: AProg TypeExpr -> TProg
genTypedFlatCurry = AProg TypeExpr -> TProg
GTFC.genTypedFlatCurry

-- |Generate type-annotated FlatCurry
genAnnotatedFlatCurry :: CompilerEnv -> CS.Module Type -> IL.Module
                      -> AFC.AProg FC.TypeExpr
genAnnotatedFlatCurry :: CompilerEnv -> Module Type -> Module -> AProg TypeExpr
genAnnotatedFlatCurry = CompilerEnv -> Module Type -> Module -> AProg TypeExpr
GAFC.genAnnotatedFlatCurry

-- |Generate FlatCurry
genFlatCurry :: AFC.AProg FC.TypeExpr -> FC.Prog
genFlatCurry :: AProg TypeExpr -> Prog
genFlatCurry = AProg TypeExpr -> Prog
GFC.genFlatCurry

-- |Generate a FlatCurry interface
genFlatInterface :: FC.Prog -> FC.Prog
genFlatInterface :: Prog -> Prog
genFlatInterface = Prog -> Prog
GFC.genFlatInterface