module Development.Shake.Literate (
illiterateA
, unlitA
, literateHaskell
, literateIdris
, literateAlex
, literateHappy
, literateAgda
) where
import Development.Shake
import Development.Shake.FilePath
import Language.Preprocessor.Unlit
illiterateA :: FilePath
-> FilePath
-> Action ()
illiterateA :: FilePath -> FilePath -> Action ()
illiterateA FilePath
inF FilePath
outF = do
(Stdout FilePath
o) <- ([FilePath] -> Action (Stdout FilePath)) :-> Action Any
forall args r. (Partial, CmdArguments args) => args
cmd [FilePath
"lit", FilePath
inF]
IO () -> Action ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Action ()) -> IO () -> Action ()
forall a b. (a -> b) -> a -> b
$ FilePath -> FilePath -> IO ()
writeFile FilePath
outF FilePath
o
unlitA :: FilePath
-> FilePath
-> Action ()
unlitA :: FilePath -> FilePath -> Action ()
unlitA FilePath
inF FilePath
outF = IO () -> Action ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (FilePath -> IO ()
g (FilePath -> IO ()) -> IO FilePath -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< FilePath -> IO FilePath
readFile FilePath
inF)
where g :: FilePath -> IO ()
g = FilePath -> FilePath -> IO ()
writeFile FilePath
outF (FilePath -> IO ()) -> (FilePath -> FilePath) -> FilePath -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> FilePath -> FilePath
unlit FilePath
inF
literateRules :: String
-> Rules ()
literateRules :: FilePath -> Rules ()
literateRules FilePath
ext = FilePath
pat Partial => FilePath -> (FilePath -> Action ()) -> Rules ()
FilePath -> (FilePath -> Action ()) -> Rules ()
%> FilePath -> Action ()
g
where pat :: FilePath
pat = FilePath
"//*." FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> (Char
'l' Char -> FilePath -> FilePath
forall a. a -> [a] -> [a]
: FilePath
ext)
g :: FilePath -> Action ()
g FilePath
out = let new :: FilePath
new = (FilePath, FilePath) -> FilePath
forall a b. (a, b) -> a
fst (FilePath -> (FilePath, FilePath)
splitExtension FilePath
out) FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> (Char
'.' Char -> FilePath -> FilePath
forall a. a -> [a] -> [a]
: FilePath
ext)
in FilePath -> FilePath -> Action ()
unlitA FilePath
out FilePath
new
literateHaskell :: Rules ()
literateHaskell :: Rules ()
literateHaskell = FilePath -> Rules ()
literateRules FilePath
"hs"
literateAgda :: Rules ()
literateAgda :: Rules ()
literateAgda = FilePath -> Rules ()
literateRules FilePath
"agda"
literateIdris :: Rules ()
literateIdris :: Rules ()
literateIdris = FilePath -> Rules ()
literateRules FilePath
"idr"
literateAlex :: Rules ()
literateAlex :: Rules ()
literateAlex = FilePath -> Rules ()
literateRules FilePath
"x"
literateHappy :: Rules ()
literateHappy :: Rules ()
literateHappy = FilePath -> Rules ()
literateRules FilePath
"y"