packages feed

netwire-input-glfw 0.0.4 → 0.0.6

raw patch · 3 files changed

+69/−44 lines, 3 filesdep ~GLFW-bdep ~basedep ~netwire-input-glfwPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: GLFW-b, base, netwire-input-glfw

API changes (from Hackage documentation)

- FRP.Netwire.Input.GLFW: instance (Functor m, Monad m) => MonadKeyboard Key (StateT GLFWInputState m)
- FRP.Netwire.Input.GLFW: instance (Functor m, Monad m) => MonadMouse MouseButton (StateT GLFWInputState m)
- FRP.Netwire.Input.GLFW: instance Key Key
- FRP.Netwire.Input.GLFW: instance MouseButton MouseButton
- FRP.Netwire.Input.GLFW: instance Show GLFWInputState
- FRP.Netwire.Input.GLFW: type GLFWInputT m = StateT GLFWInputState m
+ FRP.Netwire.Input.GLFW: data GLFWInputT m a
+ FRP.Netwire.Input.GLFW: instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance Control.Monad.Trans.Class.MonadTrans FRP.Netwire.Input.GLFW.GLFWInputT
+ FRP.Netwire.Input.GLFW: instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance FRP.Netwire.Input.Key Graphics.UI.GLFW.Types.Key
+ FRP.Netwire.Input.GLFW: instance FRP.Netwire.Input.MouseButton Graphics.UI.GLFW.Types.MouseButton
+ FRP.Netwire.Input.GLFW: instance GHC.Base.Functor m => GHC.Base.Functor (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Base.Monad m => FRP.Netwire.Input.MonadKeyboard Graphics.UI.GLFW.Types.Key (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Base.Monad m => FRP.Netwire.Input.MonadMouse Graphics.UI.GLFW.Types.MouseButton (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Base.Monad m => GHC.Base.Applicative (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Base.Monad m => GHC.Base.Monad (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Base.MonadPlus m => GHC.Base.Alternative (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (FRP.Netwire.Input.GLFW.GLFWInputT m)
+ FRP.Netwire.Input.GLFW: instance GHC.Show.Show FRP.Netwire.Input.GLFW.GLFWInputState
+ FRP.Netwire.Input.GLFW: runGLFWInput :: GLFWInput a -> GLFWInputState -> (a, GLFWInputState)
+ FRP.Netwire.Input.GLFW: runGLFWInputT :: GLFWInputT m a -> GLFWInputState -> m (a, GLFWInputState)
- FRP.Netwire.Input.GLFW: getInput :: GLFWInputControl -> IO (GLFWInputState)
+ FRP.Netwire.Input.GLFW: getInput :: GLFWInputControl -> IO GLFWInputState
- FRP.Netwire.Input.GLFW: mkInputControl :: Window -> IO (GLFWInputControl)
+ FRP.Netwire.Input.GLFW: mkInputControl :: Window -> IO GLFWInputControl
- FRP.Netwire.Input.GLFW: pollGLFW :: GLFWInputState -> GLFWInputControl -> IO (GLFWInputState)
+ FRP.Netwire.Input.GLFW: pollGLFW :: GLFWInputState -> GLFWInputControl -> IO GLFWInputState
- FRP.Netwire.Input.GLFW: type GLFWInput = State GLFWInputState
+ FRP.Netwire.Input.GLFW: type GLFWInput = GLFWInputT Identity

Files

examples/Cursor.hs view
@@ -200,7 +200,7 @@       -- state (for example if the wire debounced any keys). This is what we pass       -- back to GLFW.       --  renderPrg :: IO ((Either e (), Wire s e GameMonad a ()), GLFWInputState)-      let renderPrg = runStateT (stepWire w timeState (Right undefined)) ipt'+      let renderPrg = runGLFWInputT (stepWire w timeState (Right undefined)) ipt'        -- Now run the actual IO program to extract the values from it.       ((result, w'), ipt'') <- renderPrg
lib/FRP/Netwire/Input/GLFW.hs view
@@ -14,13 +14,15 @@  -} +{-# LANGUAGE GeneralizedNewtypeDeriving #-}+ module FRP.Netwire.Input.GLFW (   -- * GLFW Input    -- ** Basic Input Monad-  GLFWInput,+  GLFWInput, runGLFWInput,   -- ** Monad Transformer-  GLFWInputT,+  GLFWInputT, runGLFWInputT,    -- * State Types   GLFWInputControl, GLFWInputState,@@ -33,14 +35,21 @@ import qualified Graphics.UI.GLFW as GLFW import Control.Applicative import Control.Concurrent.STM+import Control.Monad.RWS import Control.Monad.State+import Control.Monad.Except+import Control.Monad.Cont+import Control.Monad.Identity import GHC.Float hiding (clamp)  import FRP.Netwire.Input --------------------------------------------------------------------------------  clamp :: Ord a => a -> a -> a -> a-clamp x a b = if x < a then a else if x > b then b else x+clamp x a b+  | x < a = a+  | x > b = b+  | otherwise = x  newRange :: Floating a => a -> (a, a) -> (a, a) -> a newRange x (omin, omax) (nmin, nmax) =@@ -73,43 +82,60 @@ instance Key GLFW.Key instance MouseButton GLFW.MouseButton --- !FIXME! Perhaps this is better in its own newtype---- | The 'GLFWInput' monad is simply a state monad around the GLFWInputState-type GLFWInput = State GLFWInputState- -- | The 'GLFWInputT' monad transformer is simply a state monad transformer using -- 'GLFWInputState'-type GLFWInputT m = StateT GLFWInputState m+newtype GLFWInputT m a =+  GLFWInputT (StateT GLFWInputState m a)+  deriving ( Functor+           , Applicative+           , Alternative+           , Monad+           , MonadFix+           , MonadIO+           , MonadWriter w+           , MonadReader r+           , MonadError e+           , MonadPlus+           , MonadCont+           , MonadTrans+           ) -instance (Functor m, Monad m) =>-         MonadKeyboard GLFW.Key (StateT GLFWInputState m) where+runGLFWInputT :: GLFWInputT m a -> GLFWInputState -> m (a, GLFWInputState)+runGLFWInputT (GLFWInputT m) = runStateT m -  keyIsPressed :: GLFW.Key -> StateT GLFWInputState m Bool-  keyIsPressed key = get >>= (return . isKeyDown key)+-- | The 'GLFWInput' monad is simply the GLFWInputT transformer around the+-- identity monad.+type GLFWInput = GLFWInputT Identity -  releaseKey :: GLFW.Key -> StateT GLFWInputState m ()-  releaseKey key = get >>= (put . debounceKey key)+runGLFWInput :: GLFWInput a -> GLFWInputState -> (a, GLFWInputState)+runGLFWInput m is = runIdentity (runGLFWInputT m is) -instance (Functor m, Monad m) =>-         MonadMouse GLFW.MouseButton (StateT GLFWInputState m) where+instance Monad m => MonadKeyboard GLFW.Key (GLFWInputT m) where -  mbIsPressed :: GLFW.MouseButton -> StateT GLFWInputState m Bool-  mbIsPressed mb = get >>= (return . isButtonPressed mb)+  keyIsPressed :: GLFW.Key -> GLFWInputT m Bool+  keyIsPressed key = GLFWInputT . liftM (isKeyDown key) $ get -  releaseButton :: GLFW.MouseButton -> StateT GLFWInputState m ()-  releaseButton mb = get >>= (put . debounceButton mb)+  releaseKey :: GLFW.Key -> GLFWInputT m ()+  releaseKey key = GLFWInputT (get >>= (put . debounceKey key)) -  cursor :: StateT GLFWInputState m (Float, Float)-  cursor = get >>= (return . cursorPos)+instance Monad m => MonadMouse GLFW.MouseButton (GLFWInputT m) where -  setCursorMode :: CursorMode -> StateT GLFWInputState m ()+  mbIsPressed :: GLFW.MouseButton -> GLFWInputT m Bool+  mbIsPressed mb = GLFWInputT . liftM (isButtonPressed mb) $ get++  releaseButton :: GLFW.MouseButton -> GLFWInputT m ()+  releaseButton mb = GLFWInputT (get >>= (put . debounceButton mb))++  cursor :: GLFWInputT m (Float, Float)+  cursor = GLFWInputT . liftM cursorPos $ get++  setCursorMode :: CursorMode -> GLFWInputT m ()   setCursorMode mode = do-    ipt <- get-    put (ipt { cmode = mode })+    ipt <- GLFWInputT get+    GLFWInputT $ put (ipt { cmode = mode }) -  scroll :: StateT GLFWInputState m (Double, Double)-  scroll = get >>= (return . scrollAmt)+  scroll :: GLFWInputT m (Double, Double)+  scroll = GLFWInputT . liftM scrollAmt $ get  kEmptyInput :: GLFWInputState kEmptyInput = GLFWInputState { keysPressed = Map.empty,@@ -132,7 +158,7 @@ debounceKey key input = input { keysPressed = Map.delete key (keysPressed input) }  isButtonPressed :: GLFW.MouseButton -> GLFWInputState -> Bool-isButtonPressed mb = (Map.member mb) . mbPressed+isButtonPressed mb = Map.member mb . mbPressed  withPressedButton :: GLFWInputState -> GLFW.MouseButton -> (a -> a) -> a -> a withPressedButton input mb fn = if isButtonPressed mb input then fn else id@@ -150,7 +176,7 @@   GLFW.setCursorPos win (fromIntegral w / 2.0) (fromIntegral h / 2.0)  -- | Returns a current snapshot of the input-getInput :: GLFWInputControl -> IO (GLFWInputState)+getInput :: GLFWInputControl -> IO GLFWInputState getInput (IptCtl var _) = readTVarIO var  setInput :: GLFWInputControl -> GLFWInputState -> IO ()@@ -159,9 +185,8 @@   -- Do we need to change the cursor mode?   curMode <- GLFW.getCursorInputMode win   let newMode = modeToGLFWMode (cmode ipt)-  if newMode == curMode-    then return ()-    else GLFW.setCursorInputMode win newMode+  unless (newMode == curMode) $+    GLFW.setCursorInputMode win newMode    -- Write the new input   atomically $ writeTVar var (ipt { scrollAmt = (0, 0) })@@ -198,7 +223,7 @@       GLFW.KeyState'Released -> input {         keysPressed = Map.update removeReleased key (keysPressed input),         keysReleased =-          case (Map.lookup key (keysPressed input)) of+          case Map.lookup key (keysPressed input) of             -- If the key was just added... queue it up             Just 0 -> Set.insert key (keysReleased input)             -- If the key isn't pressed then it must have been debounced... do nothing@@ -242,7 +267,7 @@  -- | Creates and returns an 'STM' variable for the window that holds all of the -- most recent input state information-mkInputControl :: GLFW.Window -> IO (GLFWInputControl)+mkInputControl :: GLFW.Window -> IO GLFWInputControl mkInputControl win = do   ctlvar <- newTVarIO kEmptyInput   let ctl = IptCtl ctlvar win@@ -256,12 +281,12 @@ -- state. The old state must be passed in order to properly reset certain -- properties such as the scroll wheel. The returned input state is identical -- to a subsequent call to 'getInput' right after a call to 'GLFW.pollEvents'-pollGLFW :: GLFWInputState -> GLFWInputControl -> IO (GLFWInputState)+pollGLFW :: GLFWInputState -> GLFWInputControl -> IO GLFWInputState pollGLFW ipt iptctl@(IptCtl _ win) = do   let ipt' = resolveReleased ipt    -- Do we need to reset the cursor?-  if (cmode ipt') == CursorMode'Reset+  if cmode ipt' == CursorMode'Reset     then do     setCursorToWindowCenter win     setInput iptctl (resetCursorPos ipt')
netwire-input-glfw.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                netwire-input-glfw-version:             0.0.4+version:             0.0.6 synopsis:            GLFW instance of netwire-input description:         This package contains the necessary glue to allow the use                      of wires from the netwire-input package. In general, the types@@ -14,7 +14,7 @@ license-file:        LICENSE author:              Pavel Krajcevski maintainer:          Krajcevski@gmail.com-copyright:           Pavel Krajcevski, 2015+copyright:           Pavel Krajcevski, 2014-2016 category:            Game build-type:          Simple extra-source-files:  examples/Cursor.hs README.md@@ -35,10 +35,10 @@                        InstanceSigs   exposed-modules:     FRP.Netwire.Input.GLFW   -- other-modules:       -  build-depends:       base >= 4.6 && < 4.10,+  build-depends:       base >= 4.6 && < 6,                        netwire-input,                        containers,-                       GLFW-b >= 1.4.7.2,+                       GLFW-b,                        stm,                        mtl   hs-source-dirs:      lib@@ -59,9 +59,9 @@     build-depends:  base > 4.5,                     netwire >= 5,                     netwire-input,-                    netwire-input-glfw,+                    netwire-input-glfw == 0.0.6,                     OpenGL,-                    GLFW-b >= 1.4.7.2,+                    GLFW-b,                     transformers,                     array,                     bytestring,