packages feed

imprevu-0.1.0: src/Imprevu/Evaluation/TimeEval.hs

{-# LANGUAGE AllowAmbiguousTypes      #-}
{-# LANGUAGE ScopedTypeVariables      #-}
{-# LANGUAGE Rank2Types      #-}

module Imprevu.Evaluation.TimeEval where

import Imprevu.Types
import Imprevu.Evaluation.EventEval
import Imprevu.Evaluation.Types
import Data.Time
import Data.Maybe
import Data.Typeable
import Control.Concurrent.STM
import Control.Concurrent
import Control.Monad
import Control.Lens

type Time = Signal UTCTime UTCTime

--launchTimeEvents :: (Monad n) => TVar s -> EvalConfN n s -> IO ()
--launchTimeEvents tv ec = do
--    now <- getCurrentTime
--    --putStrLn $ "tick " ++ (show now)
--    s <- atomically $ readTVar tv
--    let timeEvents = join $ maybeToList $ runEvaluate (getTimeEvents now) (EvalEnv s ec)
--    unless (null timeEvents) $ putStrLn "found time event(s)"
--    mapM_ (triggerTimeEvent tv ec) timeEvents
--    --sleep 30 second roughly
--    threadDelay 30000000
--    launchTimeEvents tv ec

triggerTimeEvent :: (Monad n) => EvalConfN n s -> UTCTime -> s -> s
triggerTimeEvent ec t s = execSignals (return ()) [(Signal t, t)] (EvalEnv s ec)
    --save m'

-- | get all events that has not been triggered yet
getTimeEvents :: UTCTime -> EvaluateN n s [UTCTime]
getTimeEvents now = do
   eis <- use events
   times <- mapM getTimes eis
   return $ filter (\t -> t <= now && t > (-32) `addUTCTime` now) (join times)

getTimes :: EventInfoN n -> EvaluateN n s [UTCTime]
getTimes ei = do
  rss <- getRemainingSignals' ei
  return $ mapMaybe getTime rss

getTime :: SomeSignal -> Maybe UTCTime
getTime (SomeSignal (Signal t)) = cast t
getTime _                    = Nothing