36 lines
1.2 KiB
Haskell
36 lines
1.2 KiB
Haskell
-- | Interval-based implementation of preview polling, for the platforms which
|
|
-- are not supported by inotify.
|
|
--
|
|
module Hakyll.Web.Preview.Poll
|
|
( previewPoll
|
|
) where
|
|
|
|
import Control.Applicative ((<$>))
|
|
import Control.Concurrent (threadDelay)
|
|
import Control.Monad (when)
|
|
import System.Time (getClockTime)
|
|
import Data.Set (Set)
|
|
import qualified Data.Set as S
|
|
import System.Directory (getModificationTime)
|
|
|
|
import Hakyll.Core.Configuration
|
|
import Hakyll.Core.Identifier
|
|
import Hakyll.Core.ResourceProvider
|
|
|
|
-- | A preview thread that periodically recompiles the site.
|
|
--
|
|
previewPoll :: HakyllConfiguration -- ^ Configuration
|
|
-> Set Resource -- ^ Resources to watch
|
|
-> IO () -- ^ Action called when something changes
|
|
-> IO () -- ^ Can block forever
|
|
previewPoll _ resources callback = do
|
|
let files = map (toFilePath . unResource) $ S.toList resources
|
|
time <- getClockTime
|
|
loop files time
|
|
where
|
|
delay = 1000000
|
|
loop files time = do
|
|
threadDelay delay
|
|
modified <- any (time <) <$> mapM getModificationTime files
|
|
when modified callback
|
|
loop files =<< getClockTime
|