module Monitor (
monitor,
) where
import Control.Concurrent
import Control.Exception
import Control.Monad
import Data.IORef
import Data.Time
import System.IO
import Text.Printf
monitor :: FilePath -> (String -> IO a) -> IO ()
monitor filename m = do
r <- newIORef ""
forever $ do
cur <- readFile filename
bef <- readIORef r
length cur `seq` writeIORef r cur
when (cur /= bef) $ try_ $ do
_ <- m cur
ct <- getCurrentTime
tz <- getCurrentTimeZone
printf "[%s]: update\n" (show $ utcToLocalTime tz ct)
hFlush stdout
threadDelay $ 10^(6::Int)
try_ :: IO a -> IO ()
try_ m = do
ret <- try m
case ret of
Left (SomeException e) -> do
print e
hFlush stdout
Right _ ->
return ()