    {-# OPTIONS_HADDOCK hide #-}

    module Graphics.Gloss.Internals.Interface.Animate.State
    	( State (..)
    	, stateInit )
    where

    -- | Animation State
    data State
    	= State
    	{
    	-- | Whether the animation is running.
    	  stateAnimate			:: !Bool

            -- | How many times we've entered the animation loop.
            , stateAnimateCount             :: !Integer

    	-- | Whether this is the first frame of the animation.
    	, stateAnimateStart		:: !Bool

    	-- | Number of msec the animation has been running for
    	, stateAnimateTime		:: !Double

    	-- | The time when we entered the display callback for the current frame.
    	, stateDisplayTime		:: !Double
    	, stateDisplayTimeLast		:: !Double

    	-- | Clamp the minimum time between frames to this value (in seconds)
            --      Setting this to < 10ms probably isn't worthwhile.
    	, stateDisplayTimeClamp		:: !Double

    	-- | The time when the last call to the users render function finished.
    	, stateGateTimeStart		:: !Double

    	-- | The time when displayInWindow last finished (after sleeping to clamp fps).
    	, stateGateTimeEnd		:: !Double

    	-- | How long it took to draw this frame
    	, stateGateTimeElapsed		:: !Double }

    stateInit :: State
    stateInit
    	= State
    	{ stateAnimate			= True
            , stateAnimateCount             = 0
    	, stateAnimateStart		= True
    	, stateAnimateTime		= 0
    	, stateDisplayTime		= 0
    	, stateDisplayTimeLast		= 0
    	, stateDisplayTimeClamp		= 0.01
    	, stateGateTimeStart		= 0
    	, stateGateTimeEnd		= 0
    	, stateGateTimeElapsed		= 0 }