packages feed

follow-file-0.0.1.1: app/Main.hs

import Path
import qualified Data.ByteString.Lazy as BS
import qualified Data.Text as T
import Data.Attoparsec.Text (parseOnly, endOfInput, eitherP)
import Data.Attoparsec.Path (absFilePath, relFilePath, absDirPath)
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 = do
  [f] <- getArgs
  f <- case parseOnly (eitherP absFilePath relFilePath <* endOfInput) (T.pack f) 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
  bracket (follow i f BS.putStr) (\watch -> removeWatch watch >> killINotify i) $ \_ -> forever $ threadDelay 50000