hcron-0.0.0.2: HCron.hs
{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}
{-# OPTIONS -fno-warn-orphans #-}
-- | A simple ''cron'' loop. Used for running commands according to a given schedule.
module HCron
( module HCron.Schedule
, cronLoop )
where
import HCron.Schedule
import Control.Concurrent
import Data.Time
-- | Given a schedule of commands, run them when their time is due.
-- Only one command is run at a time. If several commands could be started at a specific
-- moment, then we take the one with the earliest potential start time. If any command throws
-- an error then the whole loop does.
--
cronLoop :: Schedule (IO ()) -> IO ()
cronLoop schedule = do
startTime <- getCurrentTime
case earliestEventToStartAt startTime $ eventsOfSchedule schedule of
Nothing -> do
sleep 1
cronLoop schedule
Just event -> do
let Just cmd = lookupCommandOfSchedule (eventName event) schedule
cmd
endTime <- getCurrentTime
let event' = event
{ eventLastStarted = Just startTime
, eventLastEnded = Just endTime }
let schedule' = adjustEventOfSchedule event' schedule
cronLoop schedule'
-- | Sleep for a given number of seconds.
sleep :: Int -> IO ()
sleep secs
= threadDelay $ secs * 1000000