-- module: Hscaffold
-- author: Pedro Tacla Yamada
-- synopsis: Very simple file/directory structure scaffolding writer monad EDSL
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}

module Hscaffold
    ( -- * Running Hscaffold
      runHscaffold
      -- * Convert Hscaffold to HSFILES (@stack templates@)
    , toHsfiles
    , writeToHsfiles
      -- * Convert HSFILES to Hscaffold
    , fromHsfiles
    , fromHsfilesW
    , readHsfiles
      -- * Convert a directory to Hscaffold
    , hscaffoldFromDirectory
    , hscaffoldFromDirectoryWith
      -- * Compile Hscaffold to Haskell code
    , hscaffoldToHaskell
      -- ** Finer grained runners
    , runAction
    , runWriter
    , runWriterT
      -- * EDSL Combinators
    , directory
    , file
    , link
    , copy
    , touch
      -- ** Setting permissions
    , permissions
    , fileWith
    , directoryWith
    , copyWith
    , touchWith
    , Permissions(..)
      -- * Types
    , ScaffoldMonadT
    , ScaffoldMonadIO
    , ScaffoldActionType(..)
    , ScaffoldAction
    , ScaffoldActionV
    , ScaffoldMonadET
      -- * Utilities
    , withTemporaryHscaffold
    , withTemporaryHscaffold'
    , withTemporaryHscaffoldIO
    , withTemporaryHscaffoldIO'
      -- * Helpers
    , runHscaffoldIO
    , mkActionPath
      -- * Re-exports
    , Text
    , module Control.Monad.IO.Class
    , module Control.Monad.Writer
    , module System.Directory
    , module System.FilePath
    ) where

import           Control.Monad.IO.Class
import           Control.Monad.Writer
import           Data.Text                     (Text)
import           System.Directory
-- TODO - Disable this on Windows
import           System.FilePath

import           Hscaffold.EDSL
import           Hscaffold.Generator.Directory
import           Hscaffold.Generator.Hsfiles
import           Hscaffold.Interpreter.Common
import           Hscaffold.Interpreter.Haskell
import           Hscaffold.Interpreter.Hsfiles
import           Hscaffold.Interpreter.IO
import           Hscaffold.Types