packages feed

keid-core-0.1.8.0: src/Engine/Events/MouseButton.hs

module Engine.Events.MouseButton
  ( ClickHandler
  , callback
  , handler
  ) where

import RIO

import Geomancy (Vec2)
import UnliftIO.Resource (ReleaseKey)

import Engine.Events.Sink (MonadSink, Sink)
import Engine.Window.MouseButton (ModifierKeys, MouseButton, MouseButtonState)
import Engine.Window.MouseButton qualified as MouseButton
import Engine.Worker qualified as Worker

type ClickHandler e st m =
  Sink e st ->
  Vec2 ->
  (ModifierKeys, MouseButtonState, MouseButton) ->
  m ()

callback
  :: ( MonadSink rs m
     , Worker.HasOutput cursor
     , Worker.GetOutput cursor ~ Vec2
     )
  => cursor
  -> ClickHandler e st m
  -------------------------
  -> Sink e st
  -> m ReleaseKey
callback cursorP eventHandler = MouseButton.callback . handler cursorP eventHandler

handler
  :: ( MonadSink rs m
     , Worker.HasOutput cursor
     , Worker.GetOutput cursor ~ Vec2
     )
  => cursor
  -> ClickHandler e st m
  -> Sink e st
  -> (ModifierKeys, MouseButtonState, MouseButton)
  -> m ()
handler cursorP eventHandler sink buttonEvent = do
  cursorPos <- Worker.getOutputData cursorP
  logDebug $ "MouseButton event: " <> displayShow (cursorPos, buttonEvent)
  eventHandler sink cursorPos buttonEvent