cuboid-0.14.2: Input.hs
{-# LANGUAGE Arrows #-}
module Input (parseInput) where
import FRP.Yampa
import FRP.Yampa.Utilities
import Graphics.UI.GLUT
import Types
-- Event Definition:
filterKeyDowns :: SF (Event Input) (Event Input)
filterKeyDowns = arr $ filterE ((==Down) . keyState)
keyIntegral :: Double -> SF (Event a) Double
keyIntegral a = let eventToSpeed (Event _) = a
eventToSpeed NoEvent = 0
in arr eventToSpeed >>> integral
-- Input
parseInput :: SF (Event Input) ParsedInput
parseInput = proc i -> do
down <- filterKeyDowns -< i
wCount <- countKey 'w' -< down
aCount <- countKey 'a' -< down
sCount <- countKey 's' -< down
dCount <- countKey 'd' -< down
upEvs <- filterKey (SpecialKey KeyUp) -< down
downEvs <- filterKey (SpecialKey KeyDown) -< down
rightEvs <- filterKey (SpecialKey KeyRight) -< down
leftEvs <- filterKey (SpecialKey KeyLeft) -< down
returnA -< ParsedInput wCount aCount sCount dCount
upEvs downEvs rightEvs leftEvs
where countKey c = filterE ((==(Char c)) . key) ^>> keyIntegral 1
filterKey k = arr $ filterE ((==k) . key)