module Main where import Path import qualified Data.Text as T import Data.Attoparsec.Text (parseOnly, endOfInput, eitherP) import Data.Attoparsec.Path (absFilePath, relFilePath, absDirPath) import Data.Conduit ((.|), runConduit) import Data.Conduit.Combinators (stdout) import System.INotify (initINotify, removeWatch, killINotify) import System.File.Follow (follow) import System.Directory (getCurrentDirectory) import System.Environment (getArgs) import Control.Monad (forever) import Control.Exception (bracket) import Control.Concurrent (threadDelay) main :: IO () main = do [filePath] <- getArgs f <- case parseOnly (eitherP absFilePath relFilePath <* endOfInput) (T.pack filePath) of Left e -> error e Right eAR -> case eAR of Left a -> pure a Right r -> do d <- getCurrentDirectory case parseOnly (absDirPath <* endOfInput) (T.pack (d ++ "/")) of Left e -> error e Right d' -> pure (d' r) i <- initINotify let obtain = follow i f $ \source -> runConduit (source .| stdout) release watch = removeWatch watch >> killINotify i bracket obtain release $ \_ -> forever (threadDelay 50000) -- run forever