-- Allows to create a massive inputHandler that can handle anything -- after you specify what you want it to do. module RPGEngine.Internals.Input ( InputHandler(..) , composeInputHandlers , handle , handleKey , handleAnyKey ) where import Graphics.Gloss.Interface.IO.Game ----------------------------- Constants ------------------------------ type InputHandler a = Event -> (a -> a) ---------------------------------------------------------------------- -- Compose multiple InputHandlers into one InputHandler that handles -- all of them. composeInputHandlers :: [InputHandler a] -> InputHandler a composeInputHandlers [] ev a = a composeInputHandlers (ih:ihs) ev a = composeInputHandlers ihs ev (ih ev a) -- Handle any event handle :: Event -> (a -> a) -> InputHandler a handle (EventKey key _ _ _) = handleKey key -- handle (EventMotion _) = undefined -- handle (EventResize _) = undefined handle _ = const (const id) -- Handle a event by pressing a key handleKey :: Key -> (a -> a) -> InputHandler a handleKey (SpecialKey sk) = handleSpecialKey sk handleKey (Char c ) = handleCharKey c handleKey (MouseButton _ ) = const (const id) -- Handle any key, equivalent to "Press any key to start" handleAnyKey :: (a -> a) -> InputHandler a handleAnyKey f (EventKey _ Down _ _) = f handleAnyKey _ _ = id ---------------------------------------------------------------------- handleCharKey :: Char -> (a -> a) -> InputHandler a handleCharKey c1 f (EventKey (Char c2) Down _ _) | c1 == c2 = f | otherwise = id handleCharKey _ _ _ = id handleSpecialKey :: SpecialKey -> (a -> a) -> InputHandler a handleSpecialKey sk1 f (EventKey (SpecialKey sk2) Down _ _) | sk1 == sk2 = f | otherwise = id handleSpecialKey _ _ _ = id