module Engine.Events.CursorPos where

import RIO

import Geomancy (Vec2, vec2)
import GHC.Float (double2Float)
import UnliftIO.Resource (ReleaseKey)

import Engine.Types (StageRIO)
import Engine.Window.CursorPos qualified as CursorPos
import Engine.Worker qualified as Worker

import Engine.Events (Sink)

callback
  :: ( Worker.HasInput cursor
     , Worker.GetInput cursor ~ Vec2
     )
  => cursor
  -------------------------
  -> Sink e rs
  -> StageRIO rs ReleaseKey
callback :: cursor -> Sink e rs -> StageRIO rs ReleaseKey
callback cursor
cursorVar = Callback rs -> StageRIO rs ReleaseKey
forall st. Callback st -> StageRIO st ReleaseKey
CursorPos.callback (Callback rs -> StageRIO rs ReleaseKey)
-> (Sink e rs -> Callback rs)
-> Sink e rs
-> StageRIO rs ReleaseKey
forall b c a. (b -> c) -> (a -> b) -> a -> c
. cursor -> Sink e rs -> Callback rs
forall cursor e rs.
(HasInput cursor, GetInput cursor ~ Vec2) =>
cursor -> Sink e rs -> Callback rs
handler cursor
cursorVar

handler
  :: ( Worker.HasInput cursor
     , Worker.GetInput cursor ~ Vec2
     )
  => cursor
  -> Sink e rs
  -> CursorPos.Callback rs
handler :: cursor -> Sink e rs -> Callback rs
handler cursor
cursorVar Sink e rs
_sink Double
windowX Double
windowY = do
  -- logDebug $ "CursorPos event: " <> displayShow (windowX, windowY)
  cursor -> (GetInput cursor -> GetInput cursor) -> StageRIO rs ()
forall (m :: * -> *) var.
(MonadIO m, HasInput var) =>
var -> (GetInput var -> GetInput var) -> m ()
Worker.pushInput cursor
cursorVar \GetInput cursor
_old ->
    Float -> Float -> Vec2
vec2 (Double -> Float
double2Float Double
windowX) (Double -> Float
double2Float Double
windowY)