content: {-# LANGUAGE RecordWildCards #-}
  -- | An opaque representation of a Haskell module.
  -- 
  -- The few parts which can be modified are easier to modify than using raw
  -- bytes or a raw HaskellSource.
  module Data.HaskellModule
    ( module Data.HaskellModule.Base
    , module Data.HaskellModule.Parse
    , showModule, writeModule
    , compileModule, compileModuleWithArgs
    ) where
  
  import Control.Monad.Trans.Class
  import qualified Data.ByteString.Char8 as B
  
  import Data.HaskellSource
  import Control.Monad.Trans.Uncertain
  
  -- Most of the API is re-exported from those submodules
  import Data.HaskellModule.Base
  import Data.HaskellModule.Parse
  
  
  -- |
  -- >>> B.putStr $ showModule "orig.hs" $ emptyModule
  -- 
  -- >>> B.putStr $ showModule "orig.hs" $ addExtension "OverloadedStrings" $ addImport ("Data.ByteString.Char8", Just "B") $ addExtension "RecordWildCards" $ addImport ("Prelude", Nothing) $ emptyModule
  -- {-# LANGUAGE OverloadedStrings #-}
  -- {-# LANGUAGE RecordWildCards #-}
  -- import qualified Data.ByteString.Char8 as B
  -- import Prelude
  showModule :: FilePath -- ^ the original's filename,
                         --   used for fixing up line numbers
             -> HaskellModule -> B.ByteString
  showModule orig (HaskellModule {..}) = showSource orig fullSource
    where
      fullSource = concat [ pragmaSource
                          , moduleSource
                          , importSource
                          , codeSource
                          ]
  
  writeModule :: FilePath -- ^ the original's filename,
                          --   used for fixing up line numbers
              -> FilePath
              -> HaskellModule
              -> IO ()
  writeModule orig f = B.writeFile f . showModule orig
  
  
  compileModule :: FilePath -- ^ the original's filename,
                            --   used for fixing up line numbers
                -> FilePath -- ^ new filename, because ghc compiles from disk.
                            --   the compiled output will be in the same folder.
                -> HaskellModule
                -> UncertainT IO ()
  compileModule = compileModuleWithArgs []
  
  compileModuleWithArgs :: [String] -- ^ extra ghc args
                        -> FilePath -- ^ the original's filename,
                                    --   used for fixing up line numbers
                        -> FilePath -- ^ new filename, because ghc compiles from disk.
                                    --   the compiled output will be in the same folder.
                        -> HaskellModule
                        -> UncertainT IO ()
  compileModuleWithArgs args orig f m = do
      lift $ writeModule orig f m
      compileFileWithArgs args f
  