packages feed

piyo-0.1.0.0: src/Piyo/Internal/InputState.hs

module Piyo.Internal.InputState
    ( updateInputs
    , mkAction
    , extractPayload
    , payloadToAction
    , getKey
    )
where

import qualified SDL
import           Data.List
import           Piyo.Internal.Common
import           Piyo.Internal.Types


updateInputs :: KeyMotion -> [Input] -> [Input]
updateInputs (Pressed  i) is = union is [i]
updateInputs (Released i) is = is \\ [i]

mkAction :: Maybe SDL.Event -> Action
mkAction = maybe Idle (payloadToAction . extractPayload)

extractPayload :: SDL.Event -> SDL.EventPayload
extractPayload (SDL.Event _ p) = p

payloadToAction :: SDL.EventPayload -> Action
payloadToAction SDL.QuitEvent         = Quit
payloadToAction (SDL.KeyboardEvent k) = getKey k
payloadToAction _                     = Idle

getKey :: SDL.KeyboardEventData -> Action
getKey (SDL.KeyboardEventData _ SDL.Pressed False keysym) =
    case SDL.keysymKeycode keysym of
        SDL.KeycodeEscape -> Quit
        SDL.KeycodeUp     -> KeyInput (Pressed BtnUp)
        SDL.KeycodeDown   -> KeyInput (Pressed BtnDown)
        SDL.KeycodeLeft   -> KeyInput (Pressed BtnLeft)
        SDL.KeycodeRight  -> KeyInput (Pressed BtnRight)
        SDL.KeycodeZ      -> KeyInput (Pressed BtnA)
        SDL.KeycodeX      -> KeyInput (Pressed BtnB)
        _                 -> Idle
getKey (SDL.KeyboardEventData _ SDL.Released False keysym) =
    case SDL.keysymKeycode keysym of
        SDL.KeycodeEscape -> Quit
        SDL.KeycodeUp     -> KeyInput (Released BtnUp)
        SDL.KeycodeDown   -> KeyInput (Released BtnDown)
        SDL.KeycodeLeft   -> KeyInput (Released BtnLeft)
        SDL.KeycodeRight  -> KeyInput (Released BtnRight)
        SDL.KeycodeZ      -> KeyInput (Pressed BtnA)
        SDL.KeycodeX      -> KeyInput (Pressed BtnB)
        _                 -> Idle
getKey _ = Idle