module Gamgine.Engine where
import Graphics.UI.GLFW (getTime)
import Control.Monad.State (MonadIO, liftIO)
import Control.Applicative ((<$>))
import Data.Maybe (fromMaybe)


mkUpdateLoop :: (MonadIO m) => Int -> Int -> m a -> (Double -> m (Double, Double))
mkUpdateLoop ticksPerSecond maxFrameSkip update = \nextFrame -> loop nextFrame 0
   where
      loop nextFrame skippedFrames = do
         time <- liftIO (fromMaybe nextFrame <$> getTime)
         if time > nextFrame && skippedFrames < maxFrameSkip
            then do
               update
               loop (nextFrame + skipTicks) (skippedFrames + 1)
            else do
               let interpol = interpolation time nextFrame skipTicks
               return (nextFrame, interpol)

      interpolation time nextFrame skipTicks =
         (time - skipTicks - nextFrame) / skipTicks

      skipTicks = 1 / (fromIntegral ticksPerSecond :: Double)