{-# LANGUAGE QuasiQuotes #-} module Atomo.Kernel.Time (load) where import Data.Time.Clock.POSIX (getPOSIXTime) import Atomo load :: VM () load = do ([$p|Timer|] =::) =<< eval [$e|Object clone|] [$p|Timer now|] =: liftM (Double . fromRational . toRational) (liftIO getPOSIXTime) [$p|Timer sleep: (n: Integer)|] =: do Integer n <- here "n" >>= findInteger liftIO (sleepFor n) return (particle "ok") [$p|Timer sleep: (d: Double)|] =: do Double d <- here "d" >>= findDouble liftIO (threadDelay (floor d)) return (particle "ok") sleepFor :: Integer -> IO () sleepFor n | n > fromIntegral limit = threadDelay limit >> sleepFor (n - fromIntegral limit) | otherwise = threadDelay (fromIntegral n) where limit = maxBound :: Int