module Halogen.Query.Event where

import HPrelude
import Halogen.Subscription
import Halogen.VDom.DOM.Monad
import Web.Event.Event

eventListener
  :: (MonadDOM m)
  => EventType
  -> EventTarget
  -> (Event -> Maybe a)
  -> Emitter m a
eventListener :: forall (m :: * -> *) a.
MonadDOM m =>
EventType -> EventTarget -> (Event -> Maybe a) -> Emitter m a
eventListener EventType
eventType EventTarget
target Event -> Maybe a
f =
  ((a -> m ()) -> m (m ())) -> Emitter m a
forall (m :: * -> *) a.
Functor m =>
((a -> m ()) -> m (m ())) -> Emitter m a
makeEmitter (((a -> m ()) -> m (m ())) -> Emitter m a)
-> ((a -> m ()) -> m (m ())) -> Emitter m a
forall a b. (a -> b) -> a -> b
$ \a -> m ()
push -> do
    listener <- (Event -> m ()) -> m EventListener
forall (m :: * -> *).
MonadDOM m =>
(Event -> m ()) -> m EventListener
mkEventListener ((Event -> m ()) -> m EventListener)
-> (Event -> m ()) -> m EventListener
forall a b. (a -> b) -> a -> b
$ \Event
ev -> (a -> m ()) -> Maybe a -> m ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ a -> m ()
push (Event -> Maybe a
f Event
ev)
    addEventListener eventType listener target
    pure $ removeEventListener eventType listener target