module Hails.FS where
import Prelude hiding (FilePath)
import Control.Concurrent.MVar
import Control.Concurrent (threadDelay, forkIO)
import Control.Monad (forever)
import Data.ReactiveValue
import Filesystem.Path.CurrentOS
import System.Directory
import System.FSNotify
pasiveFileReactive :: FilePath -> ReactiveFieldReadWrite IO String
pasiveFileReactive fp = ReactiveFieldReadWrite setter getter notifier
where getter = readFile (encodeString fp)
setter v = writeFile (encodeString fp) v
notifier _ = return ()
fileReactive :: FilePath -> IO (ReactiveFieldReadWrite IO String)
fileReactive fp = do
fpP <- canonicalizePath (encodeString fp)
notifiers <- newMVar []
let getter = readFile (encodeString fp)
setter v = writeFile (encodeString fp) v
notify = sequence_ =<< readMVar notifiers
notifier p = modifyMVar_ notifiers (\x -> return (x ++ [p]))
forkIO $ withManager $ \mgr -> do
_ <- watchDir mgr
(directory fp)
(\e -> encodeString (eventPath e) == fpP)
(const notify)
forever $ threadDelay maxBound
return $ ReactiveFieldReadWrite setter getter notifier