module System.FSNotify.Streaming
( System.FSNotify.Streaming.watchTree
, Event(..)
, WatchManager
, WatchConfig(..)
, Debounce(..)
, defaultConfig
) where
import Control.Concurrent.Chan
import Control.Exception (bracket)
import Control.Monad
import Control.Monad.Managed
import Streaming
import Streaming.Prelude (yield)
import System.FSNotify
watchTree
:: WatchConfig -> FilePath -> (Event -> Bool) -> Stream (Of Event) Managed a
watchTree config path predicate = do
chan <- liftIO newChan
manager <- lift (managed (withManagerConf config))
lift (managed_ (withTreeChan manager path predicate chan))
forever (liftIO (readChan chan) >>= yield)
withTreeChan
:: WatchManager -> FilePath -> ActionPredicate -> EventChannel -> IO a -> IO a
withTreeChan manager path predicate chan act =
bracket
(watchTreeChan manager path predicate chan)
id
(\_ -> act)