module Notifier where import Control.Monad import System.Directory import System.FilePath import System.INotify setupNotifications :: FilePath -> (String -> IO ()) -> IO () setupNotifications dir notifyFileChanged = do i <- initINotify allDirs <- getDirsRecursive dir forM_ allDirs $ \dir -> addWatch i [Modify] dir (handle dir) where handle rootDir (Modified _ (Just f)) = notifyFileChanged (makeRelative dir (rootDir f)) handle rootDir _ = return () getDirsRecursive :: FilePath -> IO [FilePath] getDirsRecursive rootDir = do contents <- getDirectoryContents rootDir innerDirs <- forM (filter (`notElem` [".", ".."]) contents) $ \path -> do let fullPath = rootDir path isDirectory <- doesDirectoryExist fullPath if isDirectory then getDirsRecursive fullPath else return [] return $ rootDir:concat innerDirs