packages feed

animate-preview-0.1.0: library/Animate/Preview/Timer.hs

module Animate.Preview.Timer where

import qualified SDL
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad (when)
import Control.Monad.Reader (asks)

import Animate.Preview.Config

class Monad m => Timer m where
  startTicks :: m Int
  default startTicks :: MonadIO m => m Int
  startTicks = fromIntegral <$> liftIO SDL.ticks

  delayTicks :: Int -> m ()
  default delayTicks :: (MonadIO m, R m) => Int -> m ()
  delayTicks start = do
    fps <- asks cFps
    liftIO $ do
      end <- fromIntegral <$> SDL.ticks
      let ms = (msps - (end -start) * fps) `div` fps
      when (ms > 0) (SDL.delay $ fromIntegral ms)
    where
      msps = 1000