Haskell: отслеживать файл без опроса (à la inotify в linux)

Есть ли библиотека библиотеки haskell для мониторинга файла без опроса?

С опросом я бы сделал следующее:

monitor file mtime handler = do
    threadDelay n -- sleep `n` ns
    t <- getModificationTime file
    if t > mtime
        then handler >> monitor file t handler
        else monitor file mtime handler

Я хочу что-то вроде блокирующего getModificationTime, который будет разбужен системой. Есть ли что-то в наличии?

Я был бы очень доволен, если бы он был доступен только для систем posix, но чем более переносимым, тем лучше: -)

Изменить: Я знаю hinotify, но я нахожусь на Mac (почему я упоминаю POSIX).

Ответ 2

Был проект GSoC, в результате которого был fsnotify пакет, который использует системные библиотеки и возвращается к опросу. Он использует hfsevents на Mac.

Ответ 3

Пакет, предложенный Sjoerd Visscher, работает как шарм (используя GHC 7.0.3 и kqueue 0.1.2.4, Mac OS X 10.6 Snow Leopard).

Я скомпилировал быстрый образец, используя его (поскольку я не мог найти документацию по API, но есть примеры на github):

import Control.Concurrent.MVar
import System.KQueue.HighLevel (watchFile, EventType, Watcher)
import System.Environment (getArgs)

watch :: MVar EventType -> FilePath -> IO Watcher
watch chan file =
    let handler ev = putMVar chan ev
    in  watchFile file handler

listen :: MVar EventType -> IO ()
listen chan = takeMVar chan >>= print >> listen chan

main :: IO ()
main = do
        args <- getArgs
        chan <- newEmptyMVar
        mapM (watch chan) args
        listen chan

Это создаст небольшую программу, в которую вы можете передавать файловые пути в качестве аргументов и контролировать эти файлы. События возвращаются через MVar и читаются основным потоком, который в основном представляет собой цикл, реализованный listen. Программа должна быть убита с помощью ^C, поскольку она предназначена для работы навсегда.