{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{- | 'EventM' provides a convenient monadic interface for handling DOM events.

The <https://developer.mozilla.org/en-US/docs/Web/API/Event DOM Event interface>
is exposed, as well as functions for accessing UIEvents and MouseEvents.
-}
module JSDOM.EventM
(
-- $doc
  EventM(..)
, SaferEventListener(..)
, EventName
, newListener
, newListenerSync
, newListenerAsync
, addListener
, removeListener
, releaseListener
, on
, onSync
, onAsync
, onTheseSync
, onTheseAsync
-- * Event interface
, event
, eventTarget
, target
, eventCurrentTarget
, eventPhase
, bubbles
, cancelable
, timeStamp
, stopPropagation
, preventDefault
, defaultPrevented
, stopImmediatePropagation
, srcElement
, getCancelBubble
, cancelBubble
, getReturnValue
, returnValue
-- * UIEvent helpers
, uiView
, uiDetail
, uiKeyCode
, uiCharCode
, uiLayerX
, uiLayerY
, uiLayerXY
, uiPageX
, uiPageY
, uiPageXY
, uiWhich
-- * MouseEvent helpers
, mouseScreenX
, mouseScreenY
, mouseScreenXY
, mouseClientX
, mouseClientY
, mouseClientXY
, mouseMovementX
, mouseMovementY
, mouseMovementXY
, mouseCtrlKey
, mouseShiftKey
, mouseAltKey
, mouseMetaKey
, mouseButton
, mouseRelatedTarget
, mouseOffsetX
, mouseOffsetY
, mouseOffsetXY
, mouseX
, mouseY
, mouseXY
, mouseFromElement
, mouseToElement
)
where
import           Control.Applicative ((<$>))
import           Control.Monad (join)
import           Control.Monad.Trans.Class (MonadTrans(..))
import           Control.Monad.Trans.Reader (ReaderT, ask, runReaderT)
import           JSDOM.Types
import qualified JSDOM.Generated.Event as Event
import qualified JSDOM.Generated.UIEvent as UIEvent
import qualified JSDOM.Generated.MouseEvent as MouseEvent
import qualified JSDOM.Generated.KeyboardEvent as KeyboardEvent
import           JSDOM.Generated.EventTarget
import           JSDOM.EventTargetClosures
import           Data.Word (Word)
import           Data.Foldable (forM_)
import           Data.Traversable (mapM)
import           Data.Coerce (coerce)

-- $doc
-- TODO: small tutorial w/ example function

-- | @IO@ with the current @Event@ in scope (read with 'event').
type EventM t e = ReaderT e DOM

-- | See 'eventListenerNew'.
newListener :: (IsEvent e) => EventM t e () -> DOM (SaferEventListener t e)
newListener :: EventM t e () -> DOM (SaferEventListener t e)
newListener EventM t e ()
f = (e -> JSM ()) -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
(e -> JSM ()) -> JSM (SaferEventListener t e)
eventListenerNew (EventM t e () -> e -> JSM ()
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT EventM t e ()
f)

-- | See 'eventListenerNewSync'.
newListenerSync :: (IsEvent e) => EventM t e () -> DOM (SaferEventListener t e)
newListenerSync :: EventM t e () -> DOM (SaferEventListener t e)
newListenerSync EventM t e ()
f = (e -> JSM ()) -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
(e -> JSM ()) -> JSM (SaferEventListener t e)
eventListenerNewSync (EventM t e () -> e -> JSM ()
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT EventM t e ()
f)

-- | See 'eventListenerNewAsync'.
newListenerAsync :: (IsEvent e) => EventM t e () -> DOM (SaferEventListener t e)
newListenerAsync :: EventM t e () -> DOM (SaferEventListener t e)
newListenerAsync EventM t e ()
f = (e -> JSM ()) -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
(e -> JSM ()) -> JSM (SaferEventListener t e)
eventListenerNewAsync (EventM t e () -> e -> JSM ()
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT EventM t e ()
f)

-- | Add an EventListener to an EventTarget.
addListener :: (IsEventTarget t, IsEvent e) => t -> EventName t e -> SaferEventListener t e -> Bool -> DOM ()
addListener :: t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
addListener t
target EventName t e
eventName SaferEventListener t e
l Bool
useCapture = do
    EventListener
raw <- JSVal -> EventListener
EventListener (JSVal -> EventListener) -> JSM JSVal -> JSM EventListener
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SaferEventListener t e -> JSM JSVal
forall a. ToJSVal a => a -> JSM JSVal
toJSVal SaferEventListener t e
l
    t -> DOMString -> Maybe EventListener -> Bool -> JSM ()
forall (m :: * -> *) self type' options.
(MonadDOM m, IsEventTarget self, ToJSString type',
 IsAddEventListenerOptionsOrBool options) =>
self -> type' -> Maybe EventListener -> options -> m ()
addEventListener t
target (EventName t e -> DOMString
forall t e. EventName t e -> DOMString
eventNameString EventName t e
eventName) (EventListener -> Maybe EventListener
forall a. a -> Maybe a
Just EventListener
raw) Bool
useCapture

-- | Remove an EventListener from an EventTarget.
removeListener :: (IsEventTarget t, IsEvent e) => t -> EventName t e -> SaferEventListener t e -> Bool -> DOM ()
removeListener :: t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
removeListener t
target EventName t e
eventName SaferEventListener t e
l Bool
useCapture = do
    EventListener
raw <- JSVal -> EventListener
EventListener (JSVal -> EventListener) -> JSM JSVal -> JSM EventListener
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SaferEventListener t e -> JSM JSVal
forall a. ToJSVal a => a -> JSM JSVal
toJSVal SaferEventListener t e
l
    t -> DOMString -> Maybe EventListener -> Bool -> JSM ()
forall (m :: * -> *) self type' options.
(MonadDOM m, IsEventTarget self, ToJSString type',
 IsEventListenerOptionsOrBool options) =>
self -> type' -> Maybe EventListener -> options -> m ()
removeEventListener t
target (EventName t e -> DOMString
forall t e. EventName t e -> DOMString
eventNameString EventName t e
eventName) (EventListener -> Maybe EventListener
forall a. a -> Maybe a
Just EventListener
raw) Bool
useCapture

-- | Release the listener (deallocates callbacks).
releaseListener :: (IsEventTarget t, IsEvent e) => SaferEventListener t e -> DOM ()
releaseListener :: SaferEventListener t e -> JSM ()
releaseListener = SaferEventListener t e -> JSM ()
forall t e. SaferEventListener t e -> JSM ()
eventListenerRelease

-- | Shortcut for create, add and release:
--
-- @
-- releaseAction <- on element 'GHCJS.DOM.Document.click' $ do
--     w <- 'GHCJS.DOM.currentWindowUnchecked'
--     'GHCJS.DOM.Window.alert' w "I was clicked!"
-- -- remove click handler again
-- releaseAction
-- @
on :: (IsEventTarget t, IsEvent e) => t -> EventName t e -> EventM t e () -> DOM (DOM ())
on :: t -> EventName t e -> EventM t e () -> DOM (JSM ())
on t
target eventName :: EventName t e
eventName@(EventNameSyncDefault DOMString
_) = t -> EventName t e -> EventM t e () -> DOM (JSM ())
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> EventM t e () -> DOM (JSM ())
onSync t
target EventName t e
eventName
on t
target eventName :: EventName t e
eventName@(EventNameAsyncDefault DOMString
_) = t -> EventName t e -> EventM t e () -> DOM (JSM ())
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> EventM t e () -> DOM (JSM ())
onAsync t
target EventName t e
eventName

-- | Like 'on' but always uses 'newListenerSync'
onSync :: (IsEventTarget t, IsEvent e) => t -> EventName t e -> EventM t e () -> DOM (DOM ())
onSync :: t -> EventName t e -> EventM t e () -> DOM (JSM ())
onSync t
target EventName t e
eventName EventM t e ()
callback = do
    SaferEventListener t e
l <- EventM t e () -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
EventM t e () -> DOM (SaferEventListener t e)
newListenerSync EventM t e ()
callback
    t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
addListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False
    JSM () -> DOM (JSM ())
forall (m :: * -> *) a. Monad m => a -> m a
return (JSM () -> DOM (JSM ())) -> JSM () -> DOM (JSM ())
forall a b. (a -> b) -> a -> b
$ do
        t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
removeListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False
        SaferEventListener t e -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
SaferEventListener t e -> JSM ()
releaseListener SaferEventListener t e
l

-- | Like 'on' but always uses 'newListenerAsync'
onAsync :: (IsEventTarget t, IsEvent e) => t -> EventName t e -> EventM t e () -> JSM (JSM ())
onAsync :: t -> EventName t e -> EventM t e () -> DOM (JSM ())
onAsync t
target EventName t e
eventName EventM t e ()
callback = do
    SaferEventListener t e
l <- EventM t e () -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
EventM t e () -> DOM (SaferEventListener t e)
newListenerAsync EventM t e ()
callback
    t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
addListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False
    JSM () -> DOM (JSM ())
forall (m :: * -> *) a. Monad m => a -> m a
return (JSM () -> DOM (JSM ())) -> JSM () -> DOM (JSM ())
forall a b. (a -> b) -> a -> b
$ do
        t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
removeListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False
        SaferEventListener t e -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
SaferEventListener t e -> JSM ()
releaseListener SaferEventListener t e
l

-- | 'onSync' for multiple targets & events.
--
--   The returned @IO@ action removes them all at once.
onTheseSync :: (IsEventTarget t, IsEvent e) => [(t, EventName t e)] -> EventM t e () -> DOM (DOM ())
onTheseSync :: [(t, EventName t e)] -> EventM t e () -> DOM (JSM ())
onTheseSync [(t, EventName t e)]
targetsAndEventNames EventM t e ()
callback = do
    SaferEventListener t e
l <- EventM t e () -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
EventM t e () -> DOM (SaferEventListener t e)
newListenerSync EventM t e ()
callback
    [(t, EventName t e)] -> ((t, EventName t e) -> JSM ()) -> JSM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [(t, EventName t e)]
targetsAndEventNames (((t, EventName t e) -> JSM ()) -> JSM ())
-> ((t, EventName t e) -> JSM ()) -> JSM ()
forall a b. (a -> b) -> a -> b
$ \(t
target, EventName t e
eventName) ->
        t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
addListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False
    JSM () -> DOM (JSM ())
forall (m :: * -> *) a. Monad m => a -> m a
return (do
        [(t, EventName t e)] -> ((t, EventName t e) -> JSM ()) -> JSM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [(t, EventName t e)]
targetsAndEventNames (\(t
target, EventName t e
eventName) ->
            t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
removeListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False)
        SaferEventListener t e -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
SaferEventListener t e -> JSM ()
releaseListener SaferEventListener t e
l)

-- | 'onAsync' for multiple targets & events.
--
--   The returned @IO@ action removes them all at once.
onTheseAsync :: (IsEventTarget t, IsEvent e) => [(t, EventName t e)] -> EventM t e () -> DOM (DOM ())
onTheseAsync :: [(t, EventName t e)] -> EventM t e () -> DOM (JSM ())
onTheseAsync [(t, EventName t e)]
targetsAndEventNames EventM t e ()
callback = do
    SaferEventListener t e
l <- EventM t e () -> DOM (SaferEventListener t e)
forall e t.
IsEvent e =>
EventM t e () -> DOM (SaferEventListener t e)
newListenerAsync EventM t e ()
callback
    [(t, EventName t e)] -> ((t, EventName t e) -> JSM ()) -> JSM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [(t, EventName t e)]
targetsAndEventNames (((t, EventName t e) -> JSM ()) -> JSM ())
-> ((t, EventName t e) -> JSM ()) -> JSM ()
forall a b. (a -> b) -> a -> b
$ \(t
target, EventName t e
eventName) ->
        t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
addListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False
    JSM () -> DOM (JSM ())
forall (m :: * -> *) a. Monad m => a -> m a
return (do
        [(t, EventName t e)] -> ((t, EventName t e) -> JSM ()) -> JSM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [(t, EventName t e)]
targetsAndEventNames (\(t
target, EventName t e
eventName) ->
            t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
t -> EventName t e -> SaferEventListener t e -> Bool -> JSM ()
removeListener t
target EventName t e
eventName SaferEventListener t e
l Bool
False)
        SaferEventListener t e -> JSM ()
forall t e.
(IsEventTarget t, IsEvent e) =>
SaferEventListener t e -> JSM ()
releaseListener SaferEventListener t e
l)

event :: EventM t e e
event :: EventM t e e
event = EventM t e e
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask

eventTarget :: IsEvent e => EventM t e (Maybe EventTarget)
eventTarget :: EventM t e (Maybe EventTarget)
eventTarget = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e (Maybe EventTarget))
-> EventM t e (Maybe EventTarget)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM (Maybe EventTarget) -> EventM t e (Maybe EventTarget)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM (Maybe EventTarget) -> EventM t e (Maybe EventTarget))
-> (e -> DOM (Maybe EventTarget))
-> e
-> EventM t e (Maybe EventTarget)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM (Maybe EventTarget)
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m (Maybe EventTarget)
Event.getTarget)

eventTargetUnsafe :: IsEvent e => EventM t e EventTarget
eventTargetUnsafe :: EventM t e EventTarget
eventTargetUnsafe = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e EventTarget) -> EventM t e EventTarget
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM EventTarget -> EventM t e EventTarget
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM EventTarget -> EventM t e EventTarget)
-> (e -> DOM EventTarget) -> e -> EventM t e EventTarget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM EventTarget
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self, HasCallStack) =>
self -> m EventTarget
Event.getTargetUnsafe)

eventTargetUnchecked :: IsEvent e => EventM t e EventTarget
eventTargetUnchecked :: EventM t e EventTarget
eventTargetUnchecked = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e EventTarget) -> EventM t e EventTarget
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM EventTarget -> EventM t e EventTarget
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM EventTarget -> EventM t e EventTarget)
-> (e -> DOM EventTarget) -> e -> EventM t e EventTarget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM EventTarget
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m EventTarget
Event.getTargetUnchecked)

target :: (IsEvent e, IsGObject t) => EventM t e (Maybe t)
target :: EventM t e (Maybe t)
target = EventM Any e (Maybe EventTarget)
forall e t. IsEvent e => EventM t e (Maybe EventTarget)
eventTarget EventM Any e (Maybe EventTarget)
-> (Maybe EventTarget -> EventM t e (Maybe t))
-> EventM t e (Maybe t)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (EventTarget -> ReaderT e DOM t)
-> Maybe EventTarget -> EventM t e (Maybe t)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (JSM t -> ReaderT e DOM t
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM (JSM t -> ReaderT e DOM t)
-> (EventTarget -> JSM t) -> EventTarget -> ReaderT e DOM t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> JSM t
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked (JSVal -> JSM t) -> (EventTarget -> JSVal) -> EventTarget -> JSM t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventTarget -> JSVal
coerce)

targetUnsafe :: (IsEvent e, IsGObject t) => EventM t e t
targetUnsafe :: EventM t e t
targetUnsafe = EventM Any e EventTarget
forall e t. IsEvent e => EventM t e EventTarget
eventTargetUnsafe EventM Any e EventTarget
-> (EventTarget -> EventM t e t) -> EventM t e t
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM t -> EventM t e t
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM (JSM t -> EventM t e t)
-> (EventTarget -> JSM t) -> EventTarget -> EventM t e t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> JSM t
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked (JSVal -> JSM t) -> (EventTarget -> JSVal) -> EventTarget -> JSM t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventTarget -> JSVal
coerce)

targetUnchecked :: (IsEvent e, IsGObject t) => EventM t e t
targetUnchecked :: EventM t e t
targetUnchecked = EventM Any e EventTarget
forall e t. IsEvent e => EventM t e EventTarget
eventTargetUnchecked EventM Any e EventTarget
-> (EventTarget -> EventM t e t) -> EventM t e t
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM t -> EventM t e t
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM (JSM t -> EventM t e t)
-> (EventTarget -> JSM t) -> EventTarget -> EventM t e t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> JSM t
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked (JSVal -> JSM t) -> (EventTarget -> JSVal) -> EventTarget -> JSM t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventTarget -> JSVal
coerce)

eventCurrentTarget :: IsEvent e => EventM t e (Maybe EventTarget)
eventCurrentTarget :: EventM t e (Maybe EventTarget)
eventCurrentTarget = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e (Maybe EventTarget))
-> EventM t e (Maybe EventTarget)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM (Maybe EventTarget) -> EventM t e (Maybe EventTarget)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM (Maybe EventTarget) -> EventM t e (Maybe EventTarget))
-> (e -> DOM (Maybe EventTarget))
-> e
-> EventM t e (Maybe EventTarget)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM (Maybe EventTarget)
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m (Maybe EventTarget)
Event.getCurrentTarget)

eventCurrentTargetUnsafe :: IsEvent e => EventM t e EventTarget
eventCurrentTargetUnsafe :: EventM t e EventTarget
eventCurrentTargetUnsafe = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e EventTarget) -> EventM t e EventTarget
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM EventTarget -> EventM t e EventTarget
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM EventTarget -> EventM t e EventTarget)
-> (e -> DOM EventTarget) -> e -> EventM t e EventTarget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM EventTarget
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self, HasCallStack) =>
self -> m EventTarget
Event.getCurrentTargetUnsafe)

eventCurrentTargetUnchecked :: IsEvent e => EventM t e EventTarget
eventCurrentTargetUnchecked :: EventM t e EventTarget
eventCurrentTargetUnchecked = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e EventTarget) -> EventM t e EventTarget
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM EventTarget -> EventM t e EventTarget
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM EventTarget -> EventM t e EventTarget)
-> (e -> DOM EventTarget) -> e -> EventM t e EventTarget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM EventTarget
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m EventTarget
Event.getCurrentTargetUnchecked)

eventPhase :: IsEvent e => EventM t e Word
eventPhase :: EventM t e Word
eventPhase = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Word) -> EventM t e Word
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Word -> EventM t e Word
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Word -> EventM t e Word)
-> (e -> DOM Word) -> e -> EventM t e Word
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Word
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Word
Event.getEventPhase)

bubbles :: IsEvent e => EventM t e Bool
bubbles :: EventM t e Bool
bubbles = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Bool
Event.getBubbles)

cancelable :: IsEvent e => EventM t e Bool
cancelable :: EventM t e Bool
cancelable = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Bool
Event.getCancelable)

timeStamp :: IsEvent e => EventM t e Word
timeStamp :: EventM t e Word
timeStamp = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Word) -> EventM t e Word
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Word -> EventM t e Word
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Word -> EventM t e Word)
-> (e -> DOM Word) -> e -> EventM t e Word
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Word
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Word
Event.getTimeStamp)

stopPropagation :: IsEvent e => EventM t e ()
stopPropagation :: EventM t e ()
stopPropagation = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e ()) -> EventM t e ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM () -> EventM t e ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM () -> EventM t e ()) -> (e -> JSM ()) -> e -> EventM t e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> JSM ()
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m ()
Event.stopPropagation)

preventDefault :: IsEvent e => EventM t e ()
preventDefault :: EventM t e ()
preventDefault = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e ()) -> EventM t e ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM () -> EventM t e ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM () -> EventM t e ()) -> (e -> JSM ()) -> e -> EventM t e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> JSM ()
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m ()
Event.preventDefault)

defaultPrevented :: IsEvent e => EventM t e Bool
defaultPrevented :: EventM t e Bool
defaultPrevented = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Bool
Event.getDefaultPrevented)

stopImmediatePropagation :: IsEvent e => EventM t e ()
stopImmediatePropagation :: EventM t e ()
stopImmediatePropagation = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e ()) -> EventM t e ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM () -> EventM t e ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM () -> EventM t e ()) -> (e -> JSM ()) -> e -> EventM t e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> JSM ()
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m ()
Event.stopImmediatePropagation)

srcElement :: IsEvent e => EventM t e EventTarget
srcElement :: EventM t e EventTarget
srcElement = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e EventTarget) -> EventM t e EventTarget
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM EventTarget -> EventM t e EventTarget
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM EventTarget -> EventM t e EventTarget)
-> (e -> DOM EventTarget) -> e -> EventM t e EventTarget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM EventTarget
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m EventTarget
Event.getSrcElement)

getCancelBubble :: IsEvent e => EventM t e Bool
getCancelBubble :: EventM t e Bool
getCancelBubble = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Bool
Event.getCancelBubble)

cancelBubble :: IsEvent e => Bool -> EventM t e ()
cancelBubble :: Bool -> EventM t e ()
cancelBubble Bool
f = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e ()) -> EventM t e ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM () -> EventM t e ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM () -> EventM t e ()) -> (e -> JSM ()) -> e -> EventM t e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (e -> Bool -> JSM ()) -> Bool -> e -> JSM ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip e -> Bool -> JSM ()
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> Bool -> m ()
Event.setCancelBubble Bool
f)

getReturnValue :: IsEvent e => EventM t e Bool
getReturnValue :: EventM t e Bool
getReturnValue = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> m Bool
Event.getReturnValue)

returnValue :: IsEvent e => Bool -> EventM t e ()
returnValue :: Bool -> EventM t e ()
returnValue Bool
f = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e ()) -> EventM t e ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (JSM () -> EventM t e ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM () -> EventM t e ()) -> (e -> JSM ()) -> e -> EventM t e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (e -> Bool -> JSM ()) -> Bool -> e -> JSM ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip e -> Bool -> JSM ()
forall (m :: * -> *) self.
(MonadDOM m, IsEvent self) =>
self -> Bool -> m ()
Event.setReturnValue Bool
f)

uiView :: IsUIEvent e => EventM t e Window
uiView :: EventM t e Window
uiView = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Window) -> EventM t e Window
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Window -> EventM t e Window
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Window -> EventM t e Window)
-> (e -> DOM Window) -> e -> EventM t e Window
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Window
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Window
UIEvent.getView)

uiDetail :: IsUIEvent e => EventM t e Int
uiDetail :: EventM t e Int
uiDetail = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getDetail)

uiKeyCode :: EventM t KeyboardEvent Word
uiKeyCode :: EventM t KeyboardEvent Word
uiKeyCode = EventM Any KeyboardEvent KeyboardEvent
forall t e. EventM t e e
event EventM Any KeyboardEvent KeyboardEvent
-> (KeyboardEvent -> EventM t KeyboardEvent Word)
-> EventM t KeyboardEvent Word
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Word -> EventM t KeyboardEvent Word
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Word -> EventM t KeyboardEvent Word)
-> (KeyboardEvent -> DOM Word)
-> KeyboardEvent
-> EventM t KeyboardEvent Word
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyboardEvent -> DOM Word
forall (m :: * -> *). MonadDOM m => KeyboardEvent -> m Word
KeyboardEvent.getKeyCode)

uiCharCode :: EventM t KeyboardEvent Word
uiCharCode :: EventM t KeyboardEvent Word
uiCharCode = EventM Any KeyboardEvent KeyboardEvent
forall t e. EventM t e e
event EventM Any KeyboardEvent KeyboardEvent
-> (KeyboardEvent -> EventM t KeyboardEvent Word)
-> EventM t KeyboardEvent Word
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Word -> EventM t KeyboardEvent Word
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Word -> EventM t KeyboardEvent Word)
-> (KeyboardEvent -> DOM Word)
-> KeyboardEvent
-> EventM t KeyboardEvent Word
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyboardEvent -> DOM Word
forall (m :: * -> *). MonadDOM m => KeyboardEvent -> m Word
KeyboardEvent.getCharCode)

uiLayerX :: IsUIEvent e => EventM t e Int
uiLayerX :: EventM t e Int
uiLayerX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getLayerX)

uiLayerY :: IsUIEvent e => EventM t e Int
uiLayerY :: EventM t e Int
uiLayerY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getLayerY)

uiLayerXY :: IsUIEvent e => EventM t e (Int, Int)
uiLayerXY :: EventM t e (Int, Int)
uiLayerXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getLayerX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getLayerY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

uiPageX :: IsUIEvent e => EventM t e Int
uiPageX :: EventM t e Int
uiPageX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getPageX)

uiPageY :: IsUIEvent e => EventM t e Int
uiPageY :: EventM t e Int
uiPageY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getPageY)

uiPageXY :: IsUIEvent e => EventM t e (Int, Int)
uiPageXY :: EventM t e (Int, Int)
uiPageXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getPageX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getPageY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

uiWhich :: IsUIEvent e => EventM t e Int
uiWhich :: EventM t e Int
uiWhich = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsUIEvent self) =>
self -> m Int
UIEvent.getWhich)

mouseScreenX :: IsMouseEvent e => EventM t e Int
mouseScreenX :: EventM t e Int
mouseScreenX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getScreenX)

mouseScreenY :: IsMouseEvent e => EventM t e Int
mouseScreenY :: EventM t e Int
mouseScreenY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getScreenY)

mouseScreenXY :: IsMouseEvent e => EventM t e (Int, Int)
mouseScreenXY :: EventM t e (Int, Int)
mouseScreenXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getScreenX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getScreenY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

mouseClientX :: IsMouseEvent e => EventM t e Int
mouseClientX :: EventM t e Int
mouseClientX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getClientX)

mouseClientY :: IsMouseEvent e => EventM t e Int
mouseClientY :: EventM t e Int
mouseClientY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getClientY)

mouseClientXY :: IsMouseEvent e => EventM t e (Int, Int)
mouseClientXY :: EventM t e (Int, Int)
mouseClientXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getClientX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getClientY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

mouseMovementX :: IsMouseEvent e => EventM t e Int
mouseMovementX :: EventM t e Int
mouseMovementX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getMovementX)

mouseMovementY :: IsMouseEvent e => EventM t e Int
mouseMovementY :: EventM t e Int
mouseMovementY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getMovementY)

mouseMovementXY :: IsMouseEvent e => EventM t e (Int, Int)
mouseMovementXY :: EventM t e (Int, Int)
mouseMovementXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getMovementX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getMovementY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

mouseCtrlKey :: IsMouseEvent e => EventM t e Bool
mouseCtrlKey :: EventM t e Bool
mouseCtrlKey = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Bool
MouseEvent.getCtrlKey)

mouseShiftKey :: IsMouseEvent e => EventM t e Bool
mouseShiftKey :: EventM t e Bool
mouseShiftKey = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Bool
MouseEvent.getShiftKey)

mouseAltKey :: IsMouseEvent e => EventM t e Bool
mouseAltKey :: EventM t e Bool
mouseAltKey = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Bool
MouseEvent.getAltKey)

mouseMetaKey :: IsMouseEvent e => EventM t e Bool
mouseMetaKey :: EventM t e Bool
mouseMetaKey = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Bool) -> EventM t e Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Bool -> EventM t e Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Bool -> EventM t e Bool)
-> (e -> DOM Bool) -> e -> EventM t e Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Bool
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Bool
MouseEvent.getMetaKey)

mouseButton :: IsMouseEvent e => EventM t e Word
mouseButton :: EventM t e Word
mouseButton = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Word) -> EventM t e Word
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Word -> EventM t e Word
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Word -> EventM t e Word)
-> (e -> DOM Word) -> e -> EventM t e Word
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Word
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Word
MouseEvent.getButton)

mouseRelatedTarget :: IsMouseEvent e => EventM t e (Maybe EventTarget)
mouseRelatedTarget :: EventM t e (Maybe EventTarget)
mouseRelatedTarget = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e (Maybe EventTarget))
-> EventM t e (Maybe EventTarget)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM (Maybe EventTarget) -> EventM t e (Maybe EventTarget)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM (Maybe EventTarget) -> EventM t e (Maybe EventTarget))
-> (e -> DOM (Maybe EventTarget))
-> e
-> EventM t e (Maybe EventTarget)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM (Maybe EventTarget)
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m (Maybe EventTarget)
MouseEvent.getRelatedTarget)

mouseOffsetX :: IsMouseEvent e => EventM t e Int
mouseOffsetX :: EventM t e Int
mouseOffsetX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getOffsetX)

mouseOffsetY :: IsMouseEvent e => EventM t e Int
mouseOffsetY :: EventM t e Int
mouseOffsetY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getOffsetY)

mouseOffsetXY :: IsMouseEvent e => EventM t e (Int, Int)
mouseOffsetXY :: EventM t e (Int, Int)
mouseOffsetXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getOffsetX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getOffsetY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

mouseX :: IsMouseEvent e => EventM t e Int
mouseX :: EventM t e Int
mouseX = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getX)

mouseY :: IsMouseEvent e => EventM t e Int
mouseY :: EventM t e Int
mouseY = EventM Any e e
forall t e. EventM t e e
event EventM Any e e -> (e -> EventM t e Int) -> EventM t e Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM Int -> EventM t e Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> EventM t e Int)
-> (e -> DOM Int) -> e -> EventM t e Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getY)

mouseXY :: IsMouseEvent e => EventM t e (Int, Int)
mouseXY :: EventM t e (Int, Int)
mouseXY = do
    e
e <- EventM Any e e
forall t e. EventM t e e
event
    Int
x <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getX e
e
    Int
y <- DOM Int -> ReaderT e DOM Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM Int -> ReaderT e DOM Int) -> DOM Int -> ReaderT e DOM Int
forall a b. (a -> b) -> a -> b
$ e -> DOM Int
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m Int
MouseEvent.getY e
e
    (Int, Int) -> EventM t e (Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
x, Int
y)

mouseFromElement :: IsMouseEvent e => EventM t e (Maybe Node)
mouseFromElement :: EventM t e (Maybe Node)
mouseFromElement = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e (Maybe Node)) -> EventM t e (Maybe Node)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM (Maybe Node) -> EventM t e (Maybe Node)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM (Maybe Node) -> EventM t e (Maybe Node))
-> (e -> DOM (Maybe Node)) -> e -> EventM t e (Maybe Node)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM (Maybe Node)
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m (Maybe Node)
MouseEvent.getFromElement)

mouseToElement :: IsMouseEvent e => EventM t e (Maybe Node)
mouseToElement :: EventM t e (Maybe Node)
mouseToElement = EventM Any e e
forall t e. EventM t e e
event EventM Any e e
-> (e -> EventM t e (Maybe Node)) -> EventM t e (Maybe Node)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (DOM (Maybe Node) -> EventM t e (Maybe Node)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DOM (Maybe Node) -> EventM t e (Maybe Node))
-> (e -> DOM (Maybe Node)) -> e -> EventM t e (Maybe Node)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> DOM (Maybe Node)
forall (m :: * -> *) self.
(MonadDOM m, IsMouseEvent self) =>
self -> m (Maybe Node)
MouseEvent.getToElement)