    module SDL.Raw.Timer (
      -- * Timer Support
      addTimer,
      delay,
      getPerformanceCounter,
      getPerformanceFrequency,
      getTicks,
      removeTimer
    ) where

    import Control.Monad.IO.Class
    import Data.Word
    import Foreign.C.Types
    import Foreign.Ptr
    import SDL.Raw.Types

    foreign import ccall "SDL.h SDL_AddTimer" addTimerFFI :: Word32 -> TimerCallback -> Ptr () -> IO TimerID
    foreign import ccall "SDL.h SDL_Delay" delayFFI :: Word32 -> IO ()
    foreign import ccall "SDL.h SDL_GetPerformanceCounter" getPerformanceCounterFFI :: IO Word64
    foreign import ccall "SDL.h SDL_GetPerformanceFrequency" getPerformanceFrequencyFFI :: IO Word64
    foreign import ccall "SDL.h SDL_GetTicks" getTicksFFI :: IO Word32
    foreign import ccall "SDL.h SDL_RemoveTimer" removeTimerFFI :: TimerID -> IO Bool

    addTimer :: MonadIO m => Word32 -> TimerCallback -> Ptr () -> m TimerID
    addTimer v1 v2 v3 = liftIO $ addTimerFFI v1 v2 v3
    {-# INLINE addTimer #-}

    delay :: MonadIO m => Word32 -> m ()
    delay v1 = liftIO $ delayFFI v1
    {-# INLINE delay #-}

    getPerformanceCounter :: MonadIO m => m Word64
    getPerformanceCounter = liftIO getPerformanceCounterFFI
    {-# INLINE getPerformanceCounter #-}

    getPerformanceFrequency :: MonadIO m => m Word64
    getPerformanceFrequency = liftIO getPerformanceFrequencyFFI
    {-# INLINE getPerformanceFrequency #-}

    getTicks :: MonadIO m => m Word32
    getTicks = liftIO getTicksFFI
    {-# INLINE getTicks #-}

    removeTimer :: MonadIO m => TimerID -> m Bool
    removeTimer v1 = liftIO $ removeTimerFFI v1
    {-# INLINE removeTimer #-}