module Engine.Window.MouseButton ( Callback , callback , GLFW.MouseButton(..) , GLFW.MouseButtonState(..) , GLFW.ModifierKeys(..) , mkCallback , mouseButtonState , whenPressed , whenReleased , Collection(..) , collectionGlfw , atGlfw ) where import RIO import Graphics.UI.GLFW qualified as GLFW import Resource.Collection (Generic1, Generically1(..)) import RIO.App (appEnv) import UnliftIO.Resource (ReleaseKey) import UnliftIO.Resource qualified as Resource import Engine.Events.Sink (MonadSink) import Engine.Types (GlobalHandles(..)) type Callback m = (GLFW.ModifierKeys, GLFW.MouseButtonState, GLFW.MouseButton) -> m () callback :: MonadSink rs m => Callback m -> m ReleaseKey callback :: forall rs (m :: * -> *). MonadSink rs m => Callback m -> m ReleaseKey callback Callback m handler = do Window window <- forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks forall a b. (a -> b) -> a -> b $ GlobalHandles -> Window ghWindow forall b c a. (b -> c) -> (a -> b) -> a -> c . forall env st. App env st -> env appEnv forall (m :: * -> *) a. MonadUnliftIO m => (UnliftIO m -> IO a) -> m a withUnliftIO \UnliftIO m ul -> Window -> Maybe MouseButtonCallback -> IO () GLFW.setMouseButtonCallback Window window forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. a -> Maybe a Just forall a b. (a -> b) -> a -> b $ forall (m :: * -> *). UnliftIO m -> Callback m -> MouseButtonCallback mkCallback UnliftIO m ul Callback m handler forall (m :: * -> *). MonadResource m => IO () -> m ReleaseKey Resource.register forall a b. (a -> b) -> a -> b $ Window -> Maybe MouseButtonCallback -> IO () GLFW.setMouseButtonCallback Window window forall a. Maybe a Nothing mkCallback :: UnliftIO m -> Callback m -> GLFW.MouseButtonCallback mkCallback :: forall (m :: * -> *). UnliftIO m -> Callback m -> MouseButtonCallback mkCallback (UnliftIO forall a. m a -> IO a ul) Callback m action = \Window _window MouseButton button MouseButtonState buttonState ModifierKeys mods -> forall a. m a -> IO a ul forall a b. (a -> b) -> a -> b $ Callback m action (ModifierKeys mods, MouseButtonState buttonState, MouseButton button) {-# INLINE mouseButtonState #-} mouseButtonState :: a -> a -> GLFW.MouseButtonState -> a mouseButtonState :: forall a. a -> a -> MouseButtonState -> a mouseButtonState a pressed a released = \case MouseButtonState GLFW.MouseButtonState'Pressed -> a pressed MouseButtonState GLFW.MouseButtonState'Released -> a released {-# INLINE whenPressed #-} whenPressed :: Applicative f => GLFW.MouseButtonState -> f () -> f () whenPressed :: forall (f :: * -> *). Applicative f => MouseButtonState -> f () -> f () whenPressed MouseButtonState mbs f () action = forall a. a -> a -> MouseButtonState -> a mouseButtonState f () action (forall (f :: * -> *) a. Applicative f => a -> f a pure ()) MouseButtonState mbs {-# INLINE whenReleased #-} whenReleased :: Applicative f => GLFW.MouseButtonState -> f () -> f () whenReleased :: forall (f :: * -> *). Applicative f => MouseButtonState -> f () -> f () whenReleased MouseButtonState mbs f () action = forall a. a -> a -> MouseButtonState -> a mouseButtonState (forall (f :: * -> *) a. Applicative f => a -> f a pure ()) f () action MouseButtonState mbs data Collection a = Collection { forall a. Collection a -> a mb1, forall a. Collection a -> a mb2, forall a. Collection a -> a mb3, forall a. Collection a -> a mb4, forall a. Collection a -> a mb5, forall a. Collection a -> a mb6, forall a. Collection a -> a mb7, forall a. Collection a -> a mb8 :: a } deriving (Collection a -> Collection a -> Bool forall a. Eq a => Collection a -> Collection a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Collection a -> Collection a -> Bool $c/= :: forall a. Eq a => Collection a -> Collection a -> Bool == :: Collection a -> Collection a -> Bool $c== :: forall a. Eq a => Collection a -> Collection a -> Bool Eq, Collection a -> Collection a -> Bool Collection a -> Collection a -> Ordering forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall {a}. Ord a => Eq (Collection a) forall a. Ord a => Collection a -> Collection a -> Bool forall a. Ord a => Collection a -> Collection a -> Ordering forall a. Ord a => Collection a -> Collection a -> Collection a min :: Collection a -> Collection a -> Collection a $cmin :: forall a. Ord a => Collection a -> Collection a -> Collection a max :: Collection a -> Collection a -> Collection a $cmax :: forall a. Ord a => Collection a -> Collection a -> Collection a >= :: Collection a -> Collection a -> Bool $c>= :: forall a. Ord a => Collection a -> Collection a -> Bool > :: Collection a -> Collection a -> Bool $c> :: forall a. Ord a => Collection a -> Collection a -> Bool <= :: Collection a -> Collection a -> Bool $c<= :: forall a. Ord a => Collection a -> Collection a -> Bool < :: Collection a -> Collection a -> Bool $c< :: forall a. Ord a => Collection a -> Collection a -> Bool compare :: Collection a -> Collection a -> Ordering $ccompare :: forall a. Ord a => Collection a -> Collection a -> Ordering Ord, Int -> Collection a -> ShowS forall a. Show a => Int -> Collection a -> ShowS forall a. Show a => [Collection a] -> ShowS forall a. Show a => Collection a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Collection a] -> ShowS $cshowList :: forall a. Show a => [Collection a] -> ShowS show :: Collection a -> String $cshow :: forall a. Show a => Collection a -> String showsPrec :: Int -> Collection a -> ShowS $cshowsPrec :: forall a. Show a => Int -> Collection a -> ShowS Show, forall a. Rep1 Collection a -> Collection a forall a. Collection a -> Rep1 Collection a forall k (f :: k -> *). (forall (a :: k). f a -> Rep1 f a) -> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f $cto1 :: forall a. Rep1 Collection a -> Collection a $cfrom1 :: forall a. Collection a -> Rep1 Collection a Generic1, forall a b. a -> Collection b -> Collection a forall a b. (a -> b) -> Collection a -> Collection b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: forall a b. a -> Collection b -> Collection a $c<$ :: forall a b. a -> Collection b -> Collection a fmap :: forall a b. (a -> b) -> Collection a -> Collection b $cfmap :: forall a b. (a -> b) -> Collection a -> Collection b Functor, forall a. Eq a => a -> Collection a -> Bool forall a. Num a => Collection a -> a forall a. Ord a => Collection a -> a forall m. Monoid m => Collection m -> m forall a. Collection a -> Bool forall a. Collection a -> Int forall a. Collection a -> [a] forall a. (a -> a -> a) -> Collection a -> a forall m a. Monoid m => (a -> m) -> Collection a -> m forall b a. (b -> a -> b) -> b -> Collection a -> b forall a b. (a -> b -> b) -> b -> Collection a -> b forall (t :: * -> *). (forall m. Monoid m => t m -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. t a -> [a]) -> (forall a. t a -> Bool) -> (forall a. t a -> Int) -> (forall a. Eq a => a -> t a -> Bool) -> (forall a. Ord a => t a -> a) -> (forall a. Ord a => t a -> a) -> (forall a. Num a => t a -> a) -> (forall a. Num a => t a -> a) -> Foldable t product :: forall a. Num a => Collection a -> a $cproduct :: forall a. Num a => Collection a -> a sum :: forall a. Num a => Collection a -> a $csum :: forall a. Num a => Collection a -> a minimum :: forall a. Ord a => Collection a -> a $cminimum :: forall a. Ord a => Collection a -> a maximum :: forall a. Ord a => Collection a -> a $cmaximum :: forall a. Ord a => Collection a -> a elem :: forall a. Eq a => a -> Collection a -> Bool $celem :: forall a. Eq a => a -> Collection a -> Bool length :: forall a. Collection a -> Int $clength :: forall a. Collection a -> Int null :: forall a. Collection a -> Bool $cnull :: forall a. Collection a -> Bool toList :: forall a. Collection a -> [a] $ctoList :: forall a. Collection a -> [a] foldl1 :: forall a. (a -> a -> a) -> Collection a -> a $cfoldl1 :: forall a. (a -> a -> a) -> Collection a -> a foldr1 :: forall a. (a -> a -> a) -> Collection a -> a $cfoldr1 :: forall a. (a -> a -> a) -> Collection a -> a foldl' :: forall b a. (b -> a -> b) -> b -> Collection a -> b $cfoldl' :: forall b a. (b -> a -> b) -> b -> Collection a -> b foldl :: forall b a. (b -> a -> b) -> b -> Collection a -> b $cfoldl :: forall b a. (b -> a -> b) -> b -> Collection a -> b foldr' :: forall a b. (a -> b -> b) -> b -> Collection a -> b $cfoldr' :: forall a b. (a -> b -> b) -> b -> Collection a -> b foldr :: forall a b. (a -> b -> b) -> b -> Collection a -> b $cfoldr :: forall a b. (a -> b -> b) -> b -> Collection a -> b foldMap' :: forall m a. Monoid m => (a -> m) -> Collection a -> m $cfoldMap' :: forall m a. Monoid m => (a -> m) -> Collection a -> m foldMap :: forall m a. Monoid m => (a -> m) -> Collection a -> m $cfoldMap :: forall m a. Monoid m => (a -> m) -> Collection a -> m fold :: forall m. Monoid m => Collection m -> m $cfold :: forall m. Monoid m => Collection m -> m Foldable, Functor Collection Foldable Collection forall (t :: * -> *). Functor t -> Foldable t -> (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> t a -> f (t b)) -> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> t a -> m (t b)) -> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a)) -> Traversable t forall (m :: * -> *) a. Monad m => Collection (m a) -> m (Collection a) forall (f :: * -> *) a. Applicative f => Collection (f a) -> f (Collection a) forall (m :: * -> *) a b. Monad m => (a -> m b) -> Collection a -> m (Collection b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Collection a -> f (Collection b) sequence :: forall (m :: * -> *) a. Monad m => Collection (m a) -> m (Collection a) $csequence :: forall (m :: * -> *) a. Monad m => Collection (m a) -> m (Collection a) mapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> Collection a -> m (Collection b) $cmapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> Collection a -> m (Collection b) sequenceA :: forall (f :: * -> *) a. Applicative f => Collection (f a) -> f (Collection a) $csequenceA :: forall (f :: * -> *) a. Applicative f => Collection (f a) -> f (Collection a) traverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Collection a -> f (Collection b) $ctraverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Collection a -> f (Collection b) Traversable) deriving Functor Collection forall a. a -> Collection a forall a b. Collection a -> Collection b -> Collection a forall a b. Collection a -> Collection b -> Collection b forall a b. Collection (a -> b) -> Collection a -> Collection b forall a b c. (a -> b -> c) -> Collection a -> Collection b -> Collection c forall (f :: * -> *). Functor f -> (forall a. a -> f a) -> (forall a b. f (a -> b) -> f a -> f b) -> (forall a b c. (a -> b -> c) -> f a -> f b -> f c) -> (forall a b. f a -> f b -> f b) -> (forall a b. f a -> f b -> f a) -> Applicative f <* :: forall a b. Collection a -> Collection b -> Collection a $c<* :: forall a b. Collection a -> Collection b -> Collection a *> :: forall a b. Collection a -> Collection b -> Collection b $c*> :: forall a b. Collection a -> Collection b -> Collection b liftA2 :: forall a b c. (a -> b -> c) -> Collection a -> Collection b -> Collection c $cliftA2 :: forall a b c. (a -> b -> c) -> Collection a -> Collection b -> Collection c <*> :: forall a b. Collection (a -> b) -> Collection a -> Collection b $c<*> :: forall a b. Collection (a -> b) -> Collection a -> Collection b pure :: forall a. a -> Collection a $cpure :: forall a. a -> Collection a Applicative via Generically1 Collection collectionGlfw :: Collection GLFW.MouseButton collectionGlfw :: Collection MouseButton collectionGlfw = forall a. a -> a -> a -> a -> a -> a -> a -> a -> Collection a Collection MouseButton GLFW.MouseButton'1 MouseButton GLFW.MouseButton'2 MouseButton GLFW.MouseButton'3 MouseButton GLFW.MouseButton'4 MouseButton GLFW.MouseButton'5 MouseButton GLFW.MouseButton'6 MouseButton GLFW.MouseButton'7 MouseButton GLFW.MouseButton'8 {-# INLINE atGlfw #-} atGlfw :: Collection a -> GLFW.MouseButton -> a atGlfw :: forall a. Collection a -> MouseButton -> a atGlfw Collection{a mb8 :: a mb7 :: a mb6 :: a mb5 :: a mb4 :: a mb3 :: a mb2 :: a mb1 :: a $sel:mb8:Collection :: forall a. Collection a -> a $sel:mb7:Collection :: forall a. Collection a -> a $sel:mb6:Collection :: forall a. Collection a -> a $sel:mb5:Collection :: forall a. Collection a -> a $sel:mb4:Collection :: forall a. Collection a -> a $sel:mb3:Collection :: forall a. Collection a -> a $sel:mb2:Collection :: forall a. Collection a -> a $sel:mb1:Collection :: forall a. Collection a -> a ..} = \case MouseButton GLFW.MouseButton'1 -> a mb1 MouseButton GLFW.MouseButton'2 -> a mb2 MouseButton GLFW.MouseButton'3 -> a mb3 MouseButton GLFW.MouseButton'4 -> a mb4 MouseButton GLFW.MouseButton'5 -> a mb5 MouseButton GLFW.MouseButton'6 -> a mb6 MouseButton GLFW.MouseButton'7 -> a mb7 MouseButton GLFW.MouseButton'8 -> a mb8