-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Cross platform library for file change notification.
--   
--   Cross platform library for file creation, modification, and deletion
--   notification. This library builds upon existing libraries for
--   platform-specific Windows, Mac, and Linux filesystem event
--   notification.
@package fsnotify
@version 0.4.4.0

-- | This library does not currently report changes made to directories,
--   only files within watched directories.
--   
--   Minimal example:
--   
--   
--   {-# LANGUAGE OverloadedStrings #-} -- for FilePath literals
--   
--   import System.FSNotify
--   import Control.Concurrent (threadDelay)
--   import Control.Monad (forever)
--   
--   main =
--     withManager $ \mgr -> do
--       -- start a watching job (in the background)
--       watchDir
--         mgr          -- manager
--         "."          -- directory to watch
--         (const True) -- predicate
--         print        -- action
--   
--       -- sleep forever (until interrupted)
--       forever $ threadDelay 1000000
--   
module System.FSNotify

-- | A file event reported by a file watcher. Each event contains the
--   canonical path for the file and a timestamp guaranteed to be after the
--   event occurred (timestamps represent current time when FSEvents
--   receives it from the OS and/or platform-specific Haskell modules).
data Event
Added :: FilePath -> UTCTime -> EventIsDirectory -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory
Modified :: FilePath -> UTCTime -> EventIsDirectory -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory
ModifiedAttributes :: FilePath -> UTCTime -> EventIsDirectory -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory
Removed :: FilePath -> UTCTime -> EventIsDirectory -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory

-- | Note: Linux-only
WatchedDirectoryRemoved :: FilePath -> UTCTime -> EventIsDirectory -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory

-- | Note: Linux-only
CloseWrite :: FilePath -> UTCTime -> EventIsDirectory -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory

-- | Note: Linux-only
Unknown :: FilePath -> UTCTime -> EventIsDirectory -> String -> Event
[eventPath] :: Event -> FilePath
[eventTime] :: Event -> UTCTime
[eventIsDirectory] :: Event -> EventIsDirectory
[eventString] :: Event -> String
data EventIsDirectory
IsFile :: EventIsDirectory
IsDirectory :: EventIsDirectory
type EventChannel = Chan Event

-- | An action to be performed in response to an event.
type Action = Event -> IO ()

-- | A predicate used to determine whether to act on an event.
type ActionPredicate = Event -> Bool

-- | Watch manager. You need one in order to create watching jobs.
data WatchManager

-- | Perform an IO action with a WatchManager in place. Tear down the
--   WatchManager after the action is complete.
withManager :: (WatchManager -> IO a) -> IO a

-- | Start a file watch manager. Directories can only be watched when they
--   are managed by a started watch manager. When finished watching. you
--   must release resources via stopManager. It is preferrable if
--   possible to use withManager to handle this automatically.
startManager :: IO WatchManager

-- | Stop a file watch manager. Stopping a watch manager will immediately
--   stop watching for files and free resources.
stopManager :: WatchManager -> IO ()

-- | Default configuration
--   
--   
--   
- Uses OS watch mode (if possible) and single thread.
--   
defaultConfig :: WatchConfig

-- | Watch configuration.
data WatchConfig

-- | Watch mode to use.
confWatchMode :: WatchConfig -> WatchMode

-- | Threading mode to use.
confThreadingMode :: WatchConfig -> ThreadingMode

-- | Called when a handler throws an exception.
confOnHandlerException :: WatchConfig -> SomeException -> IO ()

-- | Method of watching for changes.
data WatchMode
WatchModePoll :: Int -> WatchMode

-- | Polling interval in microseconds.
[watchModePollInterval] :: WatchMode -> Int

-- | Use OS-specific mechanisms to be notified of changes (inotify on
--   Linux, FSEvents on OSX, etc.). Not currently available on e.g. *BSD
--   and Wasm/WASI.
WatchModeOS :: WatchMode
data ThreadingMode

-- | Use a single thread for the entire Manager. Event handler
--   callbacks will run sequentially.
SingleThread :: ThreadingMode

-- | Use a single thread for each watch (i.e. each call to
--   watchDir, watchTree, etc.). Callbacks within a watch
--   will run sequentially but callbacks from different watches may be
--   interleaved.
ThreadPerWatch :: ThreadingMode

-- | Launch a separate thread for every event handler.
ThreadPerEvent :: ThreadingMode

-- | Like withManager, but configurable.
withManagerConf :: WatchConfig -> (WatchManager -> IO a) -> IO a

-- | Like startManager, but configurable.
startManagerConf :: WatchConfig -> IO WatchManager

-- | An action that cancels a watching/listening job.
type StopListening = IO ()

-- | Watch the immediate contents of a directory by committing an Action
--   for each event. Watching the immediate contents of a directory will
--   only report events associated with files within the specified
--   directory, and not files within its subdirectories.
watchDir :: WatchManager -> FilePath -> ActionPredicate -> Action -> IO StopListening

-- | Watch the immediate contents of a directory by streaming events to a
--   Chan. Watching the immediate contents of a directory will only report
--   events associated with files within the specified directory, and not
--   files within its subdirectories.
watchDirChan :: WatchManager -> FilePath -> ActionPredicate -> EventChannel -> IO StopListening

-- | Watch all the contents of a directory by committing an Action for each
--   event. Watching all the contents of a directory will report events
--   associated with files within the specified directory and its
--   subdirectories.
watchTree :: WatchManager -> FilePath -> ActionPredicate -> Action -> IO StopListening

-- | Watch all the contents of a directory by streaming events to a Chan.
--   Watching all the contents of a directory will report events associated
--   with files within the specified directory and its subdirectories.
watchTreeChan :: WatchManager -> FilePath -> ActionPredicate -> EventChannel -> IO StopListening

-- | Some additional functions on top of System.FSNotify.
--   
--   Example of compiling scss files with compass
--   
--   
--   compass :: WatchManager -> FilePath -> m ()
--   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 ()
--   
module System.FSNotify.Devel

-- | In the given directory tree, watch for any events for files with the
--   given file extension
treeExtAny :: WatchManager -> FilePath -> Text -> (FilePath -> IO ()) -> IO StopListening

-- | In the given directory tree, watch for any Added and
--   Modified events (but ignore Removed events) for files
--   with the given file extension
treeExtExists :: WatchManager -> FilePath -> Text -> (FilePath -> IO ()) -> IO StopListening

-- | Turn a FilePath callback into an Event callback that
--   ignores the Event type and timestamp
doAllEvents :: Monad m => (FilePath -> m ()) -> Event -> m ()

-- | Turn a FilePath predicate into an Event predicate that
--   accepts any event types
allEvents :: (FilePath -> Bool) -> Event -> Bool

-- | Turn a FilePath predicate into an Event predicate that
--   accepts only Added, Modified, and
--   ModifiedAttributes event types
existsEvents :: (FilePath -> Bool) -> Event -> Bool
