module Ramus.DOM where

import Ramus.Signal
import Ramus.Time

data CoordinatePair = CoordinatePair { x :: Int, y :: Int }
data DimensionPair  = DimensionPair { w :: Int, h :: Int }

-- |Creates a signal which will be `true` when the key matching the given key
-- |code is pressed, and `false` when it's released.
keyPressed :: Int -> IO (Signal Bool)
keyPressed = undefined

-- |Creates a signal which will be `true` when the given mouse button is
-- |pressed, and `false` when it's released.
mouseButton :: Int -> IO (Signal Bool)
mouseButton = undefined

data Touch = Touch
  { id :: String
  , screenX :: Int
  , screenY :: Int

  , clientX :: Int
  , clientY :: Int

  , pageX :: Int
  , pageY :: Int

  , radiusX :: Int
  , radiusY :: Int

  , rotationAngle :: Float
  , force :: Float
  }

-- |A signal containing the current state of the touch device, as described by
-- |the `Touch` record type.
touch :: IO (Signal [Touch])
touch = undefined

-- |A signal which will be `true` when at least one finger is touching the
-- |touch device, and `false` otherwise.
tap :: IO (Signal Bool)
tap = do
  touches <- touch
  pure $ touches ~> \t -> case t of
    [] -> False
    _ -> True

-- |A signal containing the current mouse position.
mousePos :: IO (Signal CoordinatePair)
mousePos = undefined

-- |A signal which yields the current time, as determined by `now`, on every
-- |animation frame (see [https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame]).
animationFrame :: IO (Signal Time)
animationFrame = undefined

-- |A signal which contains the document window's current width and height.
windowDimensions :: IO (Signal DimensionPair)
windowDimensions = undefined constant