packages feed

animate-preview-0.0.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 Animate.Preview.Frame

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 => Int -> m ()
  delayTicks start = liftIO $ do
    end <- fromIntegral <$> SDL.ticks
    let ms = (msps - (end -start) * fps) `div` fps
    when (ms > 0) (SDL.delay $ fromIntegral ms)