packages feed

elm-reactor-0.1: Setup.hs

import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Simple.LocalBuildInfo
import Distribution.PackageDescription

import System.IO
import System.Exit
import System.Process
import Control.Monad
import System.FilePath
import System.Directory


main :: IO ()
main = defaultMainWithHooks simpleUserHooks { postBuild = myPostBuild }

myPostBuild :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
myPostBuild args flags pd lbi =
    do putStrLn "Custom build step: compiling debuggerInterface.elm"
       buildInterface lbi
       concatJS lbi
       postBuild simpleUserHooks args flags pd lbi

concatJS :: LocalBuildInfo -> IO ()
concatJS lbi =
  do let files = map (("assets" </> "_reactor") </>)
          [ "debuggerInterface.js"
          , "toString.js"
          , "core.js"
          , "reactor.js"
          ]
     megaJS <- concat `fmap` mapM readFile files
     _ <- putStrLn "Writing composite debugger.js"
     writeFile ("assets" </> "debugger.js") megaJS

buildInterface :: LocalBuildInfo -> IO ()
buildInterface lbi =
    do exitCode <- compile $ args "debuggerInterface.elm"
       case exitCode of
            ExitFailure _ ->
                putStrLn "Build failed: debuggerInterface"
            ExitSuccess ->
                renameFile
                    ("slider" </> "build" </> "debuggerInterface.js")
                    ("assets" </> "_reactor" </> "debuggerInterface.js")

       removeEverything "slider" "Slider.elm"
       removeEverything "slider" "debuggerInterface.elm"
    where
        args file =
            [ "--make"
            , "--only-js"
            , file
            ]

        compile args =
            do let workingDir = Just "slider"
               handle <- runProcess "elm" args workingDir Nothing Nothing Nothing Nothing
               exitCode <- waitForProcess handle
               return exitCode

        removeEverything dir file =
            do remove "cache" "elmi"
               remove "cache" "elmo"
               remove "build" "js"
            where
                remove :: String -> String -> IO ()
                remove subdir ext =
                    do let path = dir </> subdir </> file`replaceExtension` ext
                       exists <- doesFileExist path
                       when exists (removeFile path)