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)