module FPS(
makeFPSBounder
, waitFPSBound
) where
import GHC.Event
import Control.Concurrent
import Control.Monad
type FPSBound = MVar ()
-- | Creates mvar that fills periodically with given fps
makeFPSBounder :: Int -> IO FPSBound
makeFPSBounder fps = do
v <- newEmptyMVar
tm <- getSystemTimerManager
let t = ceiling ((1000000 :: Double) / fromIntegral fps)
callback v tm t
return v
where
callback v tm t = do
putMVar v ()
void $ registerTimeout tm t $ callback v tm t
-- | Wait until next FPS value is reached when the function unblocks
waitFPSBound :: FPSBound -> IO ()
waitFPSBound = takeMVar