import Data.List import System.Environment import System.FilePath import System.Process import System.INotify uniqDirs :: [FilePath] -> [FilePath] uniqDirs = nub . map takeDirectory eventHandler :: String -> [FilePath] -> FilePath -> Event -> IO () eventHandler command paths directory (Modified _ (Just file)) = if elem path paths then system command >> return () else return () where path = normalise $ directory file eventHandler _ _ _ _ = return () addWatches :: (FilePath -> Event -> IO ()) -> [FilePath] -> IO [WatchDescriptor] addWatches handler paths = do inotify <- initINotify mapM (\p -> addWatch inotify [Modify] p (handler p)) (map normalise paths) wait :: String -> IO () wait command = do _ <- getLine _ <- system command wait command parse :: [String] -> IO () parse (command:paths) = do _ <- addWatches (eventHandler command paths) $ uniqDirs paths wait command parse [] = print "Usage: monitor 'commands' [file ...]" main :: IO () main = getArgs >>= parse