-- Allows to create a massive inputHandler that can handle anything -- after you specify what you want it to do. module InputHandling ( InputHandler(..), -- Compose multiple InputHandlers into one InputHandler that handles -- all of them. composeInputHandlers, handle, handleSpecialKey ) where import Graphics.Gloss.Interface.IO.Game ----------------------------- Constants ------------------------------ type InputHandler a = Event -> (a -> a) ---------------------------------------------------------------------- composeInputHandlers :: [InputHandler a] -> InputHandler a composeInputHandlers [] ev a = a composeInputHandlers (ih:ihs) ev a = composeInputHandlers ihs ev (ih ev a) handle :: Event -> (a -> a) -> Event -> (a -> a) handle (EventKey key _ _ _) = handleKey key -- handle (EventMotion _) = undefined -- handle (EventResize _) = undefined handle _ = (\_ -> (\_ -> id)) handleKey :: Key -> (a -> a) -> Event -> (a -> a) handleKey (SpecialKey key) = handleSpecialKey key handleKey (Char _ ) = (\_ -> (\_ -> id)) handleKey (MouseButton _ ) = (\_ -> (\_ -> id)) handleSpecialKey :: SpecialKey -> (a -> a) -> Event -> (a -> a) handleSpecialKey sk1 f (EventKey (SpecialKey sk2) Down _ _) | sk1 == sk2 = f | otherwise = id handleSpecialKey _ _ _ = id