39 lines
1.3 KiB
Haskell
39 lines
1.3 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
module HsFile (mkHsFile) where
|
|
import Text.ProjectTemplate (createTemplate)
|
|
import Data.Conduit
|
|
( ($$), (=$), ConduitM, awaitForever, yield, Source )
|
|
import Control.Monad.Trans.Resource (ResourceT, runResourceT)
|
|
import qualified Data.Conduit.List as CL
|
|
import Prelude hiding (FilePath)
|
|
import Filesystem.Path ( FilePath )
|
|
import Filesystem.Path.CurrentOS ( encodeString )
|
|
import qualified Filesystem as F
|
|
import qualified Data.ByteString as BS
|
|
import Control.Monad.IO.Class (liftIO)
|
|
|
|
traverse :: FilePath -> Source (ResourceT IO) FilePath
|
|
traverse dir = do
|
|
liftIO (F.listDirectory dir) >>= mapM_ go
|
|
where
|
|
go fp = do
|
|
isFile' <- liftIO $ F.isFile fp
|
|
if isFile'
|
|
then yield fp
|
|
else do
|
|
isDir <- liftIO $ F.isDirectory fp
|
|
if isDir
|
|
then traverse fp
|
|
else return ()
|
|
|
|
mkHsFile :: IO ()
|
|
mkHsFile = runResourceT $ traverse "."
|
|
$$ readIt
|
|
=$ createTemplate
|
|
=$ awaitForever (liftIO . BS.putStr)
|
|
|
|
-- Reads a filepath from upstream and dumps a pair of (filepath, filecontents)
|
|
readIt :: ConduitM FilePath (FilePath, ResourceT IO BS.ByteString) (ResourceT IO) ()
|
|
readIt = CL.map $ \i -> (i, liftIO $ BS.readFile $ encodeString i)
|
|
|