module System.FSNotify.Devel
  ( treeExtAny, treeExtExists,
    doAllEvents,
    allEvents, existsEvents
  ) where

import Prelude hiding (FilePath, catch)

import Data.Text
import Filesystem.Path.CurrentOS
import System.FSNotify
-- import System.FSNotify.Path (fp)

-- | Example of compiling scss files with compass
--
-- @
-- compass :: WatchManager -> FilePath -> IO ()
-- compass man dir = do
--  putStrLn $ "compass " ++ encodeString dir
--  treeExtExists man dir "scss" $ \fp ->
--    when ("deploy" `notElem` splitDirectories fp) $ do
--     let d = encodeString $ head (splitDirectories rel)
--     system "cd " ++ d ++ "&& bundle exec compass compile"
--  return ()
-- @

-- | In the given directory tree,
-- watch for any Added and Modified events (but ignore Removed events)
-- for files with the given file extension
-- perform the given action
treeExtExists :: WatchManager
         -> FilePath -- ^ Directory to watch
         -> Text -- ^ extension
         -> (FilePath -> IO ()) -- ^ action to run on file
         -> IO ()
treeExtExists man dir ext action =
  watchTree man dir (existsEvents $ flip hasExtension ext) (doAllEvents action)

-- | In the given directory tree,
-- for files with the given file extension
-- perform the given action
treeExtAny :: WatchManager
         -> FilePath -- ^ Directory to watch
         -> Text -- ^ extension
         -> (FilePath -> IO ()) -- ^ action to run on file
         -> IO ()
treeExtAny man dir ext action =
  watchTree man dir (existsEvents $ flip hasExtension ext) (doAllEvents action)

doAllEvents :: Monad m => (FilePath -> m ()) -> Event -> m ()
doAllEvents action event =
  case event of
    Added    f _ -> action f
    Modified f _ -> action f
    Removed  f _ -> action f

existsEvents :: (FilePath -> Bool) -> (Event -> Bool)
existsEvents filt event =
  case event of
    Added    f _ -> filt f
    Modified f _ -> filt f
    Removed  _ _ -> False

allEvents :: (FilePath -> Bool) -> (Event -> Bool)
allEvents filt event =
  case event of
    Added    f _ -> filt f
    Modified f _ -> filt f
    Removed  f _ -> filt f
