packages feed

bake-0.2: src/Example.hs

module Example(main, platforms) where

import Development.Bake
import Development.Shake.Command
import System.Environment
import System.FilePath
import Data.List.Extra
import System.Directory
import Control.Arrow
import Control.Monad
import Data.Maybe


data Platform = Linux | Windows deriving (Show,Read)
data Action = Compile | Run Int deriving (Show,Read)

platforms = [Linux,Windows]

main :: IO ()
main = do
    let err = "You need to set an environment variable named $REPO for the Git repo"
    repo <- fromMaybe (error err) `fmap` lookupEnv "REPO"
    bake $
        ovenIncremental $
        ovenPretty "=" $
        ovenGit repo "master" Nothing $
        ovenNotifyStdout $
        ovenTest testStringy (return allTests) execute
        defaultOven{ovenServer=("127.0.0.1",5000)}

testStringy = Stringy shw rd shw
    where shw (a,b) = show a ++ " " ++ show b
          rd x = (read *** read) $ word1 x

allTests = [(p,t) | p <- platforms, t <- Compile : map Run [1,10,0]]

execute :: (Platform,Action) -> TestInfo (Platform,Action)
execute (p,Compile) = matchOS p $ run $ do
    -- ghc --make isn't a good citizen of incremental
    -- so we remove the Main.hi file to force the rebuild
    Exit _ <- cmd "rm Main.hi"
    copyFile "Main.hs" "Main.bup"
    () <- cmd "ghc --make Main.hs"
    incrementalDone
execute (p,Run i) = require [(p,Compile)] $ matchOS p $ run $ do
    when (i == 10) $ print =<< readFile "Main.hs"
    when (i == 10) $ print =<< readFile "Main.bup"
    cmd ("." </> "Main") (show i)

-- So we can run both clients on one platform we use an environment variable
-- to fake changing OS
matchOS :: Platform -> TestInfo t -> TestInfo t
matchOS p = suitable (fmap (== show p) $ getEnv "PLATFORM")