{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE UndecidableInstances   #-}
module Reflex.SDL2.Class where


import           Control.Concurrent        (MVar)
import           Control.Monad.Reader      (ReaderT)
import           Control.Monad.Trans       (lift)
import           Data.Word                 (Word32)
import           Reflex                    (Event, Reflex)
import           Reflex.DynamicWriter.Base (DynamicWriterT)
import           SDL                       hiding (Event)


class (Reflex t, Monad m) => HasSDL2Events t m | m -> t where
  getTicksEvent :: m (Event t Word32)
  getAnySDLEvent :: m (Event t EventPayload)
  getWindowShownEvent :: m (Event t WindowShownEventData)
  getWindowHiddenEvent :: m (Event t WindowHiddenEventData)
  getWindowExposedEvent :: m (Event t WindowExposedEventData)
  getWindowMovedEvent :: m (Event t WindowMovedEventData)
  getWindowResizedEvent :: m (Event t WindowResizedEventData)
  getWindowSizeChangedEvent :: m (Event t WindowSizeChangedEventData)
  getWindowMinimizedEvent :: m (Event t WindowMinimizedEventData)
  getWindowMaximizedEvent :: m (Event t WindowMaximizedEventData)
  getWindowRestoredEvent :: m (Event t WindowRestoredEventData)
  getWindowGainedMouseFocusEvent :: m (Event t WindowGainedMouseFocusEventData)
  getWindowLostMouseFocusEvent :: m (Event t WindowLostMouseFocusEventData)
  getWindowGainedKeyboardFocusEvent :: m (Event t WindowGainedKeyboardFocusEventData)
  getWindowLostKeyboardFocusEvent :: m (Event t WindowLostKeyboardFocusEventData)
  getWindowClosedEvent :: m (Event t WindowClosedEventData)
  getKeyboardEvent :: m (Event t KeyboardEventData)
  getTextEditingEvent :: m (Event t TextEditingEventData)
  getTextInputEvent :: m (Event t TextInputEventData)
  getKeymapChangedEvent :: m (Event t ())
  getMouseMotionEvent :: m (Event t MouseMotionEventData)
  getMouseButtonEvent :: m (Event t MouseButtonEventData)
  getMouseWheelEvent :: m (Event t MouseWheelEventData)
  getJoyAxisEvent :: m (Event t JoyAxisEventData)
  getJoyBallEvent :: m (Event t JoyBallEventData)
  getJoyHatEvent :: m (Event t JoyHatEventData)
  getJoyButtonEvent :: m (Event t JoyButtonEventData)
  getJoyDeviceEvent :: m (Event t JoyDeviceEventData)
  getControllerAxisEvent :: m (Event t ControllerAxisEventData)
  getControllerButtonEvent :: m (Event t ControllerButtonEventData)
  getControllerDeviceEvent :: m (Event t ControllerDeviceEventData)
  getAudioDeviceEvent :: m (Event t AudioDeviceEventData)
  getQuitEvent :: m (Event t ())
  getUserEvent :: m (Event t UserEventData)
  getSysWMEvent :: m (Event t SysWMEventData)
  getTouchFingerEvent :: m (Event t TouchFingerEventData)
  getMultiGestureEvent :: m (Event t MultiGestureEventData)
  getDollarGestureEvent :: m (Event t DollarGestureEventData)
  getDropEvent :: m (Event t DropEventData)
  getClipboardUpdateEvent :: m (Event t ())
  getUnknownEvent :: m (Event t UnknownEventData)
  getQuitVar :: m (MVar ())


instance HasSDL2Events t m => HasSDL2Events t (ReaderT r m) where
  getTicksEvent = lift getTicksEvent
  getAnySDLEvent = lift getAnySDLEvent
  getWindowShownEvent = lift getWindowShownEvent
  getWindowHiddenEvent = lift getWindowHiddenEvent
  getWindowExposedEvent = lift getWindowExposedEvent
  getWindowMovedEvent = lift getWindowMovedEvent
  getWindowResizedEvent = lift getWindowResizedEvent
  getWindowSizeChangedEvent = lift getWindowSizeChangedEvent
  getWindowMinimizedEvent = lift getWindowMinimizedEvent
  getWindowMaximizedEvent = lift getWindowMaximizedEvent
  getWindowRestoredEvent = lift getWindowRestoredEvent
  getWindowGainedMouseFocusEvent = lift getWindowGainedMouseFocusEvent
  getWindowLostMouseFocusEvent = lift getWindowLostMouseFocusEvent
  getWindowGainedKeyboardFocusEvent = lift getWindowGainedKeyboardFocusEvent
  getWindowLostKeyboardFocusEvent = lift getWindowLostKeyboardFocusEvent
  getWindowClosedEvent = lift getWindowClosedEvent
  getKeyboardEvent = lift getKeyboardEvent
  getTextEditingEvent = lift getTextEditingEvent
  getTextInputEvent = lift getTextInputEvent
  getKeymapChangedEvent = lift getKeymapChangedEvent
  getMouseMotionEvent = lift getMouseMotionEvent
  getMouseButtonEvent = lift getMouseButtonEvent
  getMouseWheelEvent = lift getMouseWheelEvent
  getJoyAxisEvent = lift getJoyAxisEvent
  getJoyBallEvent = lift getJoyBallEvent
  getJoyHatEvent = lift getJoyHatEvent
  getJoyButtonEvent = lift getJoyButtonEvent
  getJoyDeviceEvent = lift getJoyDeviceEvent
  getControllerAxisEvent = lift getControllerAxisEvent
  getControllerButtonEvent = lift getControllerButtonEvent
  getControllerDeviceEvent = lift getControllerDeviceEvent
  getAudioDeviceEvent = lift getAudioDeviceEvent
  getQuitEvent = lift getQuitEvent
  getUserEvent = lift getUserEvent
  getSysWMEvent = lift getSysWMEvent
  getTouchFingerEvent = lift getTouchFingerEvent
  getMultiGestureEvent = lift getMultiGestureEvent
  getDollarGestureEvent = lift getDollarGestureEvent
  getDropEvent = lift getDropEvent
  getClipboardUpdateEvent = lift getClipboardUpdateEvent
  getUnknownEvent = lift getUnknownEvent
  getQuitVar = lift getQuitVar


instance HasSDL2Events t m => HasSDL2Events t (DynamicWriterT t w m) where
  getTicksEvent = lift getTicksEvent
  getAnySDLEvent = lift getAnySDLEvent
  getWindowShownEvent = lift getWindowShownEvent
  getWindowHiddenEvent = lift getWindowHiddenEvent
  getWindowExposedEvent = lift getWindowExposedEvent
  getWindowMovedEvent = lift getWindowMovedEvent
  getWindowResizedEvent = lift getWindowResizedEvent
  getWindowSizeChangedEvent = lift getWindowSizeChangedEvent
  getWindowMinimizedEvent = lift getWindowMinimizedEvent
  getWindowMaximizedEvent = lift getWindowMaximizedEvent
  getWindowRestoredEvent = lift getWindowRestoredEvent
  getWindowGainedMouseFocusEvent = lift getWindowGainedMouseFocusEvent
  getWindowLostMouseFocusEvent = lift getWindowLostMouseFocusEvent
  getWindowGainedKeyboardFocusEvent = lift getWindowGainedKeyboardFocusEvent
  getWindowLostKeyboardFocusEvent = lift getWindowLostKeyboardFocusEvent
  getWindowClosedEvent = lift getWindowClosedEvent
  getKeyboardEvent = lift getKeyboardEvent
  getTextEditingEvent = lift getTextEditingEvent
  getTextInputEvent = lift getTextInputEvent
  getKeymapChangedEvent = lift getKeymapChangedEvent
  getMouseMotionEvent = lift getMouseMotionEvent
  getMouseButtonEvent = lift getMouseButtonEvent
  getMouseWheelEvent = lift getMouseWheelEvent
  getJoyAxisEvent = lift getJoyAxisEvent
  getJoyBallEvent = lift getJoyBallEvent
  getJoyHatEvent = lift getJoyHatEvent
  getJoyButtonEvent = lift getJoyButtonEvent
  getJoyDeviceEvent = lift getJoyDeviceEvent
  getControllerAxisEvent = lift getControllerAxisEvent
  getControllerButtonEvent = lift getControllerButtonEvent
  getControllerDeviceEvent = lift getControllerDeviceEvent
  getAudioDeviceEvent = lift getAudioDeviceEvent
  getQuitEvent = lift getQuitEvent
  getUserEvent = lift getUserEvent
  getSysWMEvent = lift getSysWMEvent
  getTouchFingerEvent = lift getTouchFingerEvent
  getMultiGestureEvent = lift getMultiGestureEvent
  getDollarGestureEvent = lift getDollarGestureEvent
  getDropEvent = lift getDropEvent
  getClipboardUpdateEvent = lift getClipboardUpdateEvent
  getUnknownEvent = lift getUnknownEvent
  getQuitVar = lift getQuitVar