packages feed

shake-ext-2.10.0.0: src/Development/Shake/Literate.hs

-- | Module containing functions for working with the
-- [illiterate](http://github.com/vmchale/illiterate) preprocessor for literate
-- programs.
module Development.Shake.Literate ( -- * Action
                                    illiterateA
                                  -- * Rules
                                  , literateHaskell
                                  , literateIdris
                                  , literateAlex
                                  , literateHappy
                                  ) where

import           Development.Shake
import           Development.Shake.FilePath

illiterateA :: FilePath -- ^ Literate source file
            -> FilePath -- ^ Generated source
            -> Action ()
illiterateA inF outF = do
    (Stdout o) <- cmd ["lit", inF]
    liftIO $ writeFile outF o

literateRules :: String -- ^ File extension
              -> Rules ()
literateRules ext = pat %> g
    where pat = "//*." <> ('l' : ext)
          g out = let new = fst (splitExtension out) <> ('.' : ext)
            in illiterateA out new

-- | Rules for building @.lhs@ files.
literateHaskell :: Rules ()
literateHaskell = literateRules "hs"

-- | Rules for building @.lidr@ files.
literateIdris :: Rules ()
literateIdris = literateRules "idr"

-- | Rules for building @.lx@ files
literateAlex :: Rules ()
literateAlex = literateRules "x"

-- | Rules for building @.ly@ files
literateHappy :: Rules ()
literateHappy = literateRules "y"