module InputHandler ( Event , handleInput , composeInputHandler , handleSpace , handleEnter , handleUp , handleDown , handleLeft , handleRight ) where import Graphics.Gloss import qualified Graphics.Gloss.Interface.IO.Game as Game ----------------------------- Constants ------------------------------ -- Something that happens, most often a keypress type Event = Game.Event ---------------------------------------------------------------------- -- Handle input by taking a keyCheck function that checks wheter or not -- a key is being presse handleInput :: Game.SpecialKey -> (a -> a) -> Event -> a -> a handleInput key convert ev currentState | isKey key ev = convert currentState | otherwise = currentState -- Compose multiple InputHandlers into one combined InputHandler. composeInputHandler :: [Event -> a -> a] -> Event -> a -> a composeInputHandler (ih:ihs) ev a = composeInputHandler ihs ev (ih ev a) composeInputHandler [] ev a = a -- Check if the requested key is pressed. isKey :: Game.SpecialKey -> Event -> Bool isKey k1 (Game.EventKey (Game.SpecialKey k2) Game.Down _ _) = k1 == k2 isKey _ _ = False ------------------ A couple of default inputhandlers ----------------- handleSpace :: (a -> a) -> Event -> a -> a handleSpace = handleInput Game.KeySpace handleEnter :: (a -> a) -> Event -> a -> a handleEnter = handleInput Game.KeyEnter handleUp :: (a -> a) -> Event -> a -> a handleUp = handleInput Game.KeyUp handleDown :: (a -> a) -> Event -> a -> a handleDown = handleInput Game.KeyDown handleLeft :: (a -> a) -> Event -> a -> a handleLeft = handleInput Game.KeyLeft handleRight :: (a -> a) -> Event -> a -> a handleRight = handleInput Game.KeyRight