packages feed

ehaskell-0.6: Main.hs

module Main where

import EHaskell               (parseAll, copyIfSrcExist, getImportsSrcDst,
                               processOptionEhs,
			       getEhsDir, haskellSffx, exitIfFail)
import System.Environment     (getArgs)
import System.IO              (stderr)
import System.Directory       (doesDirectoryExist, createDirectory)
import System.FilePath        (takeFileName)
import System.Exit            (exitFailure)
import System.Process         (runProcess, waitForProcess)
import Prelude hiding         (readFile, writeFile)
import System.IO.UTF8         (readFile, writeFile, hPutStr)
import Control.Applicative    ((<$>))
import Control.Monad.Tools    (unlessM)
import Data.Maybe             (maybeToList)
import YJTools.Tribial        (ghcMake)
import Text.RegexPR           (gsubRegexPR)
import Text.ParserCombinators.MTLParse
                              (Parse, runParse)

main :: IO ()
main = do
  (eqs, outfile, infile) <- processOptionEhs <$> getArgs
  let edir                = getEhsDir infile
      exeName             = gsubRegexPR "\\." "_" $ takeFileName infile
      exeFile             = edir ++ exeName
      srcFile             = edir ++ exeName ++ haskellSffx
  cont <- readFile infile
  unlessM (doesDirectoryExist edir) $ createDirectory edir
  case runParse (parseAll eqs) ("", cont) of
       []              -> hPutStr stderr "parse error" >> exitFailure
       (((p,ips),_):_) -> do
         writeFile srcFile p
         mapM_ (uncurry copyIfSrcExist . getImportsSrcDst edir) ips
  exitIfFail $ ghcMake exeName edir
  exitIfFail $ runProcess exeFile (maybeToList outfile)
                 Nothing Nothing Nothing Nothing Nothing >>= waitForProcess