spice-0.3.2.2: src/FRP/Spice/Input/Mouse.hs
{-|
The mouse (button) specific section of input.
-}
module FRP.Spice.Input.Mouse where
--------------------
-- Global Imports --
import qualified Data.Traversable as T (sequence)
import Data.Map.Strict hiding (keys, map)
import Graphics.UI.GLFW as GLFW
import FRP.Elerea.Param
import Control.Monad
----------
-- Code --
{-|
Adding an instance of Ord to MouseButton so it can be used with the map.
-}
instance Ord MouseButton where
mb1 <= mb2 = fromEnum mb1 < fromEnum mb2
{-|
A list of all mouse buttons available via the GLFW api.
-}
buttons :: [MouseButton]
buttons = [ ButtonLeft
, ButtonRight
, ButtonMiddle
]
++
map ButtonNo [0 .. 7]
{-|
A map from @'MouseButton'@ to externals created for every button.
-}
externals :: IO (Map MouseButton (Signal Bool, Bool -> IO ()))
externals = liftM fromList $ mapM (\b -> liftM ((,) b) $ external False) buttons
{-|
Creating the @'Signal'@ of a @'Map'@ from @'MouseButton'@ to @'Bool'@ from a
@'Map'@ of @'externals'@.
-}
signals :: Map MouseButton (Signal Bool, Bool -> IO ()) -> Signal (Map MouseButton Bool)
signals = T.sequence . fmap fst
{-|
Making a @'Map'@ from @'MouseButton'@ to sink from a @'Map'@ of
@'externals'@.
-}
sinks :: Map MouseButton (Signal Bool, Bool -> IO ()) -> Map MouseButton (Bool -> IO ())
sinks = fmap snd