packages feed

haskell-awk-1.1: src/Data/HaskellModule/Base.hs

{-# LANGUAGE OverloadedStrings #-}
-- | A version of HaskellSource with slightly more semantics.
module Data.HaskellModule.Base where

import Control.Applicative
import Text.Printf

import Data.HaskellSource


-- | hint has `Interpreter.Extension`, but strings are simpler.
type ExtensionName = String

-- | import [qualified] <module-name> [as <qualified-name>]
type QualifiedModule = (String, Maybe String)

-- | Three key pieces of information about a Haskell Module:
--   the language extensions it enables,
--   the module's name (if any), and
--   the modules it imports.
data HaskellModule = HaskellModule
  { languageExtensions :: [ExtensionName]   , pragmaSource :: HaskellSource
  , moduleName         :: Maybe String      , moduleSource :: HaskellSource
  , importedModules    :: [QualifiedModule] , importSource :: HaskellSource
                                            , codeSource   :: HaskellSource
  } deriving (Show, Eq)


emptyModule :: HaskellModule
emptyModule = HaskellModule [] [] Nothing [] [] [] []


addExtension :: ExtensionName -> HaskellModule -> HaskellModule
addExtension e m = m
    { languageExtensions = extraExtensions e ++ languageExtensions m
    , pragmaSource       = extraSource e ++ pragmaSource m
    }
  where
    extraExtensions = return
    extraSource = return . return . languagePragma
    
    languagePragma = printf "{-# LANGUAGE %s #-}"

addDefaultModuleName :: String -> HaskellModule -> HaskellModule
addDefaultModuleName s m = m
    { moduleName   = moduleName m <|> defaultName s
    , moduleSource = extraSource s ++ moduleSource m
    }
  where
    defaultName = return
    extraSource = return . return . moduleDeclaration
    
    moduleDeclaration = printf "module %s where"

addImport :: QualifiedModule -> HaskellModule -> HaskellModule
addImport qm m = m
    { importedModules = extraModules qm ++ importedModules m
    , importSource    = extraSource qm ++ importSource m
    }
  where
    extraModules = return
    extraSource = return . return . importStatement
    
    importStatement (fullName, Nothing) =
        printf "import %s" fullName
    importStatement (fullName, Just qualifiedName) =
        printf "import qualified %s as %s" fullName qualifiedName