    module SDL.Raw.Haptic (
      -- * Force Feedback Support
      hapticClose,
      hapticDestroyEffect,
      hapticEffectSupported,
      hapticGetEffectStatus,
      hapticIndex,
      hapticName,
      hapticNewEffect,
      hapticNumAxes,
      hapticNumEffects,
      hapticNumEffectsPlaying,
      hapticOpen,
      hapticOpenFromJoystick,
      hapticOpenFromMouse,
      hapticOpened,
      hapticPause,
      hapticQuery,
      hapticRumbleInit,
      hapticRumblePlay,
      hapticRumbleStop,
      hapticRumbleSupported,
      hapticRunEffect,
      hapticSetAutocenter,
      hapticSetGain,
      hapticStopAll,
      hapticStopEffect,
      hapticUnpause,
      hapticUpdateEffect,
      joystickIsHaptic,
      mouseIsHaptic,
      numHaptics
    ) where

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

    foreign import ccall "SDL.h SDL_HapticClose" hapticCloseFFI :: Haptic -> IO ()
    foreign import ccall "SDL.h SDL_HapticDestroyEffect" hapticDestroyEffectFFI :: Haptic -> CInt -> IO ()
    foreign import ccall "SDL.h SDL_HapticEffectSupported" hapticEffectSupportedFFI :: Haptic -> Ptr HapticEffect -> IO CInt
    foreign import ccall "SDL.h SDL_HapticGetEffectStatus" hapticGetEffectStatusFFI :: Haptic -> CInt -> IO CInt
    foreign import ccall "SDL.h SDL_HapticIndex" hapticIndexFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticName" hapticNameFFI :: CInt -> IO CString
    foreign import ccall "SDL.h SDL_HapticNewEffect" hapticNewEffectFFI :: Haptic -> Ptr HapticEffect -> IO CInt
    foreign import ccall "SDL.h SDL_HapticNumAxes" hapticNumAxesFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticNumEffects" hapticNumEffectsFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticNumEffectsPlaying" hapticNumEffectsPlayingFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticOpen" hapticOpenFFI :: CInt -> IO Haptic
    foreign import ccall "SDL.h SDL_HapticOpenFromJoystick" hapticOpenFromJoystickFFI :: Joystick -> IO Haptic
    foreign import ccall "SDL.h SDL_HapticOpenFromMouse" hapticOpenFromMouseFFI :: IO Haptic
    foreign import ccall "SDL.h SDL_HapticOpened" hapticOpenedFFI :: CInt -> IO CInt
    foreign import ccall "SDL.h SDL_HapticPause" hapticPauseFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticQuery" hapticQueryFFI :: Haptic -> IO CUInt
    foreign import ccall "SDL.h SDL_HapticRumbleInit" hapticRumbleInitFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticRumblePlay" hapticRumblePlayFFI :: Haptic -> CFloat -> Word32 -> IO CInt
    foreign import ccall "SDL.h SDL_HapticRumbleStop" hapticRumbleStopFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticRumbleSupported" hapticRumbleSupportedFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticRunEffect" hapticRunEffectFFI :: Haptic -> CInt -> Word32 -> IO CInt
    foreign import ccall "SDL.h SDL_HapticSetAutocenter" hapticSetAutocenterFFI :: Haptic -> CInt -> IO CInt
    foreign import ccall "SDL.h SDL_HapticSetGain" hapticSetGainFFI :: Haptic -> CInt -> IO CInt
    foreign import ccall "SDL.h SDL_HapticStopAll" hapticStopAllFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticStopEffect" hapticStopEffectFFI :: Haptic -> CInt -> IO CInt
    foreign import ccall "SDL.h SDL_HapticUnpause" hapticUnpauseFFI :: Haptic -> IO CInt
    foreign import ccall "SDL.h SDL_HapticUpdateEffect" hapticUpdateEffectFFI :: Haptic -> CInt -> Ptr HapticEffect -> IO CInt
    foreign import ccall "SDL.h SDL_JoystickIsHaptic" joystickIsHapticFFI :: Joystick -> IO CInt
    foreign import ccall "SDL.h SDL_MouseIsHaptic" mouseIsHapticFFI :: IO CInt
    foreign import ccall "SDL.h SDL_NumHaptics" numHapticsFFI :: IO CInt

    hapticClose :: MonadIO m => Haptic -> m ()
    hapticClose v1 = liftIO $ hapticCloseFFI v1
    {-# INLINE hapticClose #-}

    hapticDestroyEffect :: MonadIO m => Haptic -> CInt -> m ()
    hapticDestroyEffect v1 v2 = liftIO $ hapticDestroyEffectFFI v1 v2
    {-# INLINE hapticDestroyEffect #-}

    hapticEffectSupported :: MonadIO m => Haptic -> Ptr HapticEffect -> m CInt
    hapticEffectSupported v1 v2 = liftIO $ hapticEffectSupportedFFI v1 v2
    {-# INLINE hapticEffectSupported #-}

    hapticGetEffectStatus :: MonadIO m => Haptic -> CInt -> m CInt
    hapticGetEffectStatus v1 v2 = liftIO $ hapticGetEffectStatusFFI v1 v2
    {-# INLINE hapticGetEffectStatus #-}

    hapticIndex :: MonadIO m => Haptic -> m CInt
    hapticIndex v1 = liftIO $ hapticIndexFFI v1
    {-# INLINE hapticIndex #-}

    hapticName :: MonadIO m => CInt -> m CString
    hapticName v1 = liftIO $ hapticNameFFI v1
    {-# INLINE hapticName #-}

    hapticNewEffect :: MonadIO m => Haptic -> Ptr HapticEffect -> m CInt
    hapticNewEffect v1 v2 = liftIO $ hapticNewEffectFFI v1 v2
    {-# INLINE hapticNewEffect #-}

    hapticNumAxes :: MonadIO m => Haptic -> m CInt
    hapticNumAxes v1 = liftIO $ hapticNumAxesFFI v1
    {-# INLINE hapticNumAxes #-}

    hapticNumEffects :: MonadIO m => Haptic -> m CInt
    hapticNumEffects v1 = liftIO $ hapticNumEffectsFFI v1
    {-# INLINE hapticNumEffects #-}

    hapticNumEffectsPlaying :: MonadIO m => Haptic -> m CInt
    hapticNumEffectsPlaying v1 = liftIO $ hapticNumEffectsPlayingFFI v1
    {-# INLINE hapticNumEffectsPlaying #-}

    hapticOpen :: MonadIO m => CInt -> m Haptic
    hapticOpen v1 = liftIO $ hapticOpenFFI v1
    {-# INLINE hapticOpen #-}

    hapticOpenFromJoystick :: MonadIO m => Joystick -> m Haptic
    hapticOpenFromJoystick v1 = liftIO $ hapticOpenFromJoystickFFI v1
    {-# INLINE hapticOpenFromJoystick #-}

    hapticOpenFromMouse :: MonadIO m => m Haptic
    hapticOpenFromMouse = liftIO hapticOpenFromMouseFFI
    {-# INLINE hapticOpenFromMouse #-}

    hapticOpened :: MonadIO m => CInt -> m CInt
    hapticOpened v1 = liftIO $ hapticOpenedFFI v1
    {-# INLINE hapticOpened #-}

    hapticPause :: MonadIO m => Haptic -> m CInt
    hapticPause v1 = liftIO $ hapticPauseFFI v1
    {-# INLINE hapticPause #-}

    hapticQuery :: MonadIO m => Haptic -> m CUInt
    hapticQuery v1 = liftIO $ hapticQueryFFI v1
    {-# INLINE hapticQuery #-}

    hapticRumbleInit :: MonadIO m => Haptic -> m CInt
    hapticRumbleInit v1 = liftIO $ hapticRumbleInitFFI v1
    {-# INLINE hapticRumbleInit #-}

    hapticRumblePlay :: MonadIO m => Haptic -> CFloat -> Word32 -> m CInt
    hapticRumblePlay v1 v2 v3 = liftIO $ hapticRumblePlayFFI v1 v2 v3
    {-# INLINE hapticRumblePlay #-}

    hapticRumbleStop :: MonadIO m => Haptic -> m CInt
    hapticRumbleStop v1 = liftIO $ hapticRumbleStopFFI v1
    {-# INLINE hapticRumbleStop #-}

    hapticRumbleSupported :: MonadIO m => Haptic -> m CInt
    hapticRumbleSupported v1 = liftIO $ hapticRumbleSupportedFFI v1
    {-# INLINE hapticRumbleSupported #-}

    hapticRunEffect :: MonadIO m => Haptic -> CInt -> Word32 -> m CInt
    hapticRunEffect v1 v2 v3 = liftIO $ hapticRunEffectFFI v1 v2 v3
    {-# INLINE hapticRunEffect #-}

    hapticSetAutocenter :: MonadIO m => Haptic -> CInt -> m CInt
    hapticSetAutocenter v1 v2 = liftIO $ hapticSetAutocenterFFI v1 v2
    {-# INLINE hapticSetAutocenter #-}

    hapticSetGain :: MonadIO m => Haptic -> CInt -> m CInt
    hapticSetGain v1 v2 = liftIO $ hapticSetGainFFI v1 v2
    {-# INLINE hapticSetGain #-}

    hapticStopAll :: MonadIO m => Haptic -> m CInt
    hapticStopAll v1 = liftIO $ hapticStopAllFFI v1
    {-# INLINE hapticStopAll #-}

    hapticStopEffect :: MonadIO m => Haptic -> CInt -> m CInt
    hapticStopEffect v1 v2 = liftIO $ hapticStopEffectFFI v1 v2
    {-# INLINE hapticStopEffect #-}

    hapticUnpause :: MonadIO m => Haptic -> m CInt
    hapticUnpause v1 = liftIO $ hapticUnpauseFFI v1
    {-# INLINE hapticUnpause #-}

    hapticUpdateEffect :: MonadIO m => Haptic -> CInt -> Ptr HapticEffect -> m CInt
    hapticUpdateEffect v1 v2 v3 = liftIO $ hapticUpdateEffectFFI v1 v2 v3
    {-# INLINE hapticUpdateEffect #-}

    joystickIsHaptic :: MonadIO m => Joystick -> m CInt
    joystickIsHaptic v1 = liftIO $ joystickIsHapticFFI v1
    {-# INLINE joystickIsHaptic #-}

    mouseIsHaptic :: MonadIO m => m CInt
    mouseIsHaptic = liftIO mouseIsHapticFFI
    {-# INLINE mouseIsHaptic #-}

    numHaptics :: MonadIO m => m CInt
    numHaptics = liftIO numHapticsFFI
    {-# INLINE numHaptics #-}