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

    Maintainer  :  bjp@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)
import qualified Curry.FlatCurry.Annotated.Type   as AFC  (AProg, TypeExpr)
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.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 = GAC.genAbstractCurry False

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

-- |Generate typed FlatCurry
genTypedFlatCurry :: CompilerEnv -> CS.Module Type -> IL.Module
                  -> AFC.AProg AFC.TypeExpr
genTypedFlatCurry = GTFC.genTypedFlatCurry

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

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