-- | Interval-based implementation of preview polling -- {-# LANGUAGE CPP #-} module Hakyll.Web.Preview.Poll ( previewPoll ) where import Control.Applicative ((<$>)) import Control.Concurrent (threadDelay) import Control.Monad (filterM) #if MIN_VERSION_directory(1,2,0) import Data.Time (getCurrentTime) #else import System.Time (getClockTime) #endif import System.Directory (getModificationTime, doesFileExist) import Hakyll.Core.Configuration -- | A preview thread that periodically recompiles the site. -- previewPoll :: HakyllConfiguration -- ^ Configuration -> IO [FilePath] -- ^ Updating action -> IO () -- ^ Can block forever previewPoll _ update = do #if MIN_VERSION_directory(1,2,0) time <- getCurrentTime #else time <- getClockTime #endif loop time =<< update where delay = 1000000 loop time files = do threadDelay delay files' <- filterM doesFileExist files filesTime <- case files' of [] -> return time _ -> maximum <$> mapM getModificationTime files' if filesTime > time || files' /= files then loop filesTime =<< update else loop time files'