@@ -1,3 +1,4 @@
1+{-# LANGUAGE CPP #-}
12{-# LANGUAGE ConstraintKinds #-}
23{-# LANGUAGE DataKinds #-}
34{-# LANGUAGE EmptyDataDecls #-}
@@ -53,9 +54,12 @@ import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
5354import GHCJS.DOM.MouseEvent
5455import GHCJS.DOM.Node (appendChild, getOwnerDocument, getParentNode, getPreviousSibling, insertBefore,
5556 removeChild, setNodeValue, toNode)
56−import GHCJS.DOM.Types (FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node, ToDOMString, TouchEvent,
57− WheelEvent, castToHTMLInputElement, castToHTMLSelectElement,
58− castToHTMLTextAreaElement)
57+import GHCJS.DOM.Types
58+ (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
59+ FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
60+ ToDOMString, TouchEvent, WheelEvent, castToHTMLInputElement,
61+ castToHTMLSelectElement, castToHTMLTextAreaElement,
62+ strictEqual)
5963import qualified GHCJS.DOM.Types as DOM
6064import GHCJS.DOM.UIEvent
6165import qualified GHCJS.DOM.Window as Window
@@ -64,7 +68,7 @@ import Debug.Trace hiding (traceEvent)
6468
6569data TriggerRef t a = TriggerRef { unTriggerRef :: IORef (Maybe (EventTrigger t a)) }
6670
67−data TriggerInvocation a = TriggerInvocation a (IO ())
71+data TriggerInvocation a = TriggerInvocation a (JSM ())
6872
6973data ImmediateDomBuilderEnv t
7074 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
@@ -74,6 +78,11 @@ data ImmediateDomBuilderEnv t
7478
7579newtype ImmediateDomBuilderT t m a = ImmediateDomBuilderT { unImmediateDomBuilderT :: ReaderT (ImmediateDomBuilderEnv t) m a } deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException, MonadAsyncException)
7680
81+#ifndef __GHCJS__
82+instance MonadJSM m => MonadJSM (ImmediateDomBuilderT t m) where
83+ liftJSM' = ImmediateDomBuilderT . liftJSM'
84+#endif
85+
7786instance MonadTransControl (ImmediateDomBuilderT t) where
7887 type StT (ImmediateDomBuilderT t) a = StT (ReaderT (ImmediateDomBuilderEnv t)) a
7988 liftWith = defaultLiftWith ImmediateDomBuilderT unImmediateDomBuilderT
@@ -99,23 +108,23 @@ askEvents :: Monad m => ImmediateDomBuilderT t m (Chan [DSum (TriggerRef t) Trig
99108askEvents = ImmediateDomBuilderT $ asks _immediateDomBuilderEnv_events
100109
101110{-# INLINABLE append #-}
102−append :: (IsNode n, MonadIO m) => n -> ImmediateDomBuilderT t m ()
111+append :: (IsNode n, MonadJSM m) => n -> ImmediateDomBuilderT t m ()
103112append n = do
104113 p <- askParent
105− _ <- liftIO $ appendChild p $ Just n
114+ _ <- liftJSM $ appendChild p $ Just n
106115 return ()
107116
108117{-# INLINABLE textNodeInternal #-}
109−textNodeInternal :: (MonadIO m, ToDOMString contents) => contents -> ImmediateDomBuilderT t m DOM.Text
118+textNodeInternal :: (MonadJSM m, ToDOMString contents) => contents -> ImmediateDomBuilderT t m DOM.Text
110119textNodeInternal t = do
111120 doc <- askDocument
112− Just n <- liftIO $ createTextNode doc t
121+ Just n <- liftJSM $ createTextNode doc t
113122 append n
114123 return n
115124
116125-- | s and e must both be children of the same node and s must precede e
117126{-# INLINABLE deleteBetweenInclusive #-}
118−deleteBetweenInclusive :: (MonadIO m, IsNode start, IsNode end) => start -> end -> m ()
127+deleteBetweenInclusive :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
119128deleteBetweenInclusive s e = do
120129 mCurrentParent <- getParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
121130 case mCurrentParent of
@@ -124,12 +133,14 @@ deleteBetweenInclusive s e = do
124133 let go = do
125134 Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
126135 _ <- removeChild currentParent $ Just x
127− when (toNode s /= toNode x) go
136+ liftJSM (strictEqual s x) >>= \case
137+ True -> return ()
138+ False -> go
128139 go
129140 _ <- removeChild currentParent $ Just e
130141 return ()
131142
132−type SupportsImmediateDomBuilder t m = (Reflex t, MonadIO m, MonadHold t m, MonadFix m, PerformEvent t m, Performable m ~ m, MonadReflexCreateTrigger t m, Deletable t m, MonadRef m, Ref m ~ Ref IO)
143+type SupportsImmediateDomBuilder t m = (Reflex t, MonadJSM m, MonadHold t m, MonadFix m, PerformEvent t m, Performable m ~ m, MonadReflexCreateTrigger t m, Deletable t m, MonadRef m, Ref m ~ Ref JSM)
133144
134145newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IORef (Maybe (EventTrigger t (er en))))
135146
@@ -139,35 +150,37 @@ wrap e cfg = do
139150 lift $ performEvent_ $ ffor (cfg ^. modifyAttributes) $ imapM_ $ \(AttributeName mAttrNamespace n) mv -> case mAttrNamespace of
140151 Nothing -> maybe (removeAttribute e n) (setAttribute e n) mv
141152 Just ns -> maybe (removeAttributeNS e (Just ns) n) (setAttributeNS e (Just ns) n) mv
142− eventTriggerRefs :: DMap EventName (EventFilterTriggerRef t er) <- liftIO $ fmap DMap.fromList $ forM (DMap.toList $ _ghcjsEventSpec_filters $ _rawElementConfig_eventSpec cfg) $ \(en :=> GhcjsEventFilter f) -> do
143− triggerRef <- newIORef Nothing
153+ eventTriggerRefs :: DMap EventName (EventFilterTriggerRef t er) <- liftJSM $ fmap DMap.fromList $ forM (DMap.toList $ _ghcjsEventSpec_filters $ _rawElementConfig_eventSpec cfg) $ \(en :=> GhcjsEventFilter f) -> do
154+ triggerRef <- liftIO $ newIORef Nothing
144155 _ <- elementOnEventName en e $ do
145156 evt <- DOM.event
146− (flags, k) <- liftIO $ f $ GhcjsDomEvent evt
157+ (flags, k) <- liftJSM $ f $ GhcjsDomEvent evt
147158 when (_eventFlags_preventDefault flags) $ withIsEvent en DOM.preventDefault
148159 case _eventFlags_propagation flags of
149160 Propagation_Continue -> return ()
150161 Propagation_Stop -> withIsEvent en DOM.stopPropagation
151162 Propagation_StopImmediate -> withIsEvent en DOM.stopImmediatePropagation
152− mv <- liftIO k --TODO: Only do this when the event is subscribed
163+ mv <- liftJSM k --TODO: Only do this when the event is subscribed
153164 liftIO $ forM_ mv $ \v -> writeChan events [TriggerRef triggerRef :=> TriggerInvocation v (return ())]
154165 return $ en :=> EventFilterTriggerRef triggerRef
155− es <- newFanEventWithTrigger $ \(WrapArg en) t -> do
156− case DMap.lookup en eventTriggerRefs of
157− Just (EventFilterTriggerRef r) -> do
158− writeIORef r $ Just t
159− return $ do
160− writeIORef r Nothing
161− Nothing -> elementOnEventName en e $ do
162− evt <- DOM.event
163− let h = _ghcjsEventSpec_handler $ _rawElementConfig_eventSpec cfg
164− mv <- liftIO $ h (en, GhcjsDomEvent evt)
165− case mv of
166− Nothing -> return ()
167− Just v -> liftIO $ do
168− --TODO: I don't think this is quite right: if a new trigger is created between when this is enqueued and when it fires, this may not work quite right
169− ref <- newIORef $ Just t
170− writeChan events [TriggerRef ref :=> TriggerInvocation v (return ())]
166+ es <- do
167+ ctx <- askJSM
168+ newFanEventWithTrigger $ \(WrapArg en) t ->
169+ case DMap.lookup en eventTriggerRefs of
170+ Just (EventFilterTriggerRef r) -> do
171+ writeIORef r $ Just t
172+ return $ do
173+ writeIORef r Nothing
174+ Nothing -> (`runJSM` ctx) <$> (`runJSM` ctx) (elementOnEventName en e $ do
175+ evt <- DOM.event
176+ let h = _ghcjsEventSpec_handler $ _rawElementConfig_eventSpec cfg
177+ mv <- lift $ h (en, GhcjsDomEvent evt)
178+ case mv of
179+ Nothing -> return ()
180+ Just v -> liftIO $ do
181+ --TODO: I don't think this is quite right: if a new trigger is created between when this is enqueued and when it fires, this may not work quite right
182+ ref <- newIORef $ Just t
183+ writeChan events [TriggerRef ref :=> TriggerInvocation v (return ())])
171184 return $ Element es e
172185
173186{-# INLINABLE makeElement #-}
@@ -175,12 +188,12 @@ makeElement :: forall er t m a. SupportsImmediateDomBuilder t m => Text -> Eleme
175188makeElement elementTag cfg child = do
176189 doc <- askDocument
177190 events <- askEvents
178− Just e <- ImmediateDomBuilderT $ fmap DOM.castToElement <$> case cfg ^. namespace of
191+ Just e <- liftJSM $ case cfg ^. namespace of
179192 Nothing -> createElement doc (Just elementTag)
180193 Just ens -> createElementNS doc (Just ens) (Just elementTag)
181194 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
182− Nothing -> setAttribute e n v
183− Just ans -> setAttributeNS e (Just ans) n v
195+ Nothing -> lift $ setAttribute e n v
196+ Just ans -> lift $ setAttributeNS e (Just ans) n v
184197 result <- lift $ runImmediateDomBuilderT child $ ImmediateDomBuilderEnv
185198 { _immediateDomBuilderEnv_parent = toNode e
186199 , _immediateDomBuilderEnv_document = doc
@@ -190,9 +203,9 @@ makeElement elementTag cfg child = do
190203 wrapped <- wrap e $ extractRawElementConfig cfg
191204 return ((wrapped, result), e)
192205
193−newtype GhcjsDomHandler a b = GhcjsDomHandler { unGhcjsDomHandler :: a -> IO b }
206+newtype GhcjsDomHandler a b = GhcjsDomHandler { unGhcjsDomHandler :: a -> JSM b }
194207
195−newtype GhcjsDomHandler1 a b = GhcjsDomHandler1 { unGhcjsDomHandler1 :: forall (x :: EventTag). a x -> IO (b x) }
208+newtype GhcjsDomHandler1 a b = GhcjsDomHandler1 { unGhcjsDomHandler1 :: forall (x :: EventTag). a x -> JSM (b x) }
196209
197210newtype GhcjsDomEvent en = GhcjsDomEvent { unGhcjsDomEvent :: EventType en }
198211
@@ -220,7 +233,7 @@ instance DomSpace GhcjsDomSpace where
220233 in DMap.alter f' en $ _ghcjsEventSpec_filters es
221234 }
222235
223−newtype GhcjsEventFilter er en = GhcjsEventFilter (GhcjsDomEvent en -> IO (EventFlags, IO (Maybe (er en))))
236+newtype GhcjsEventFilter er en = GhcjsEventFilter (GhcjsDomEvent en -> JSM (EventFlags, JSM (Maybe (er en))))
224237
225238data Pair1 (f :: k -> *) (g :: k -> *) (a :: k) = Pair1 (f a) (g a)
226239
@@ -228,7 +241,7 @@ data Maybe1 f a = Nothing1 | Just1 (f a)
228241
229242data GhcjsEventSpec er = GhcjsEventSpec
230243 { _ghcjsEventSpec_filters :: DMap EventName (GhcjsEventFilter er)
231− , _ghcjsEventSpec_handler :: forall en. (EventName en, GhcjsDomEvent en) -> IO (Maybe (er en))
244+ , _ghcjsEventSpec_handler :: forall en. (EventName en, GhcjsDomEvent en) -> JSM (Maybe (er en))
232245 }
233246
234247instance er ~ EventResult => Default (GhcjsEventSpec er) where
@@ -236,7 +249,8 @@ instance er ~ EventResult => Default (GhcjsEventSpec er) where
236249 { _ghcjsEventSpec_filters = mempty
237250 , _ghcjsEventSpec_handler = \(en, GhcjsDomEvent evt) -> do
238251 Just t <- withIsEvent en $ Event.getTarget evt --TODO: Rework this; defaultDomEventHandler shouldn't need to take this as an argument
239− runReaderT (defaultDomEventHandler (Element.castToElement t) en) evt
252+ e <- Element.castToElement t
253+ runReaderT (defaultDomEventHandler e en) evt
240254 }
241255
242256instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t m) where
@@ -260,7 +274,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
260274 {-# INLINABLE inputElement #-}
261275 inputElement cfg = do
262276 ((e, _), domElement) <- makeElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
263− let domInputElement = castToHTMLInputElement domElement
277+ domInputElement <- liftJSM $ castToHTMLInputElement domElement
264278 Input.setValue domInputElement $ Just (cfg ^. inputElementConfig_initialValue)
265279 Just v0 <- Input.getValue domInputElement
266280 let getMyValue = fromMaybe "" <$> Input.getValue domInputElement
@@ -307,7 +321,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
307321 {-# INLINABLE textAreaElement #-}
308322 textAreaElement cfg = do --TODO
309323 ((e, _), domElement) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
310− let domTextAreaElement = castToHTMLTextAreaElement domElement
324+ domTextAreaElement <- liftJSM $ castToHTMLTextAreaElement domElement
311325 TextArea.setValue domTextAreaElement $ Just (cfg ^. textAreaElementConfig_initialValue)
312326 Just v0 <- TextArea.getValue domTextAreaElement
313327 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
@@ -330,7 +344,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
330344 {-# INLINABLE selectElement #-}
331345 selectElement cfg child = do
332346 ((e, result), domElement) <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
333− let domSelectElement = castToHTMLSelectElement domElement
347+ domSelectElement <- liftJSM $ castToHTMLSelectElement domElement
334348 Select.setValue domSelectElement $ Just (cfg ^. selectElementConfig_initialValue)
335349 Just v0 <- Select.getValue domSelectElement
336350 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
@@ -363,7 +377,7 @@ mkHasFocus e = do
363377 ]
364378
365379{-# INLINABLE insertImmediateAbove #-}
366−insertImmediateAbove :: (Reflex t, IsNode placeholder, PerformEvent t m, MonadIO (Performable m)) => placeholder -> Event t (ImmediateDomBuilderT t (Performable m) a) -> ImmediateDomBuilderT t m (Event t a)
380+insertImmediateAbove :: (Reflex t, IsNode placeholder, PerformEvent t m, MonadJSM (Performable m)) => placeholder -> Event t (ImmediateDomBuilderT t (Performable m) a) -> ImmediateDomBuilderT t m (Event t a)
367381insertImmediateAbove n toInsertAbove = do
368382 events <- askEvents
369383 lift $ performEvent $ ffor toInsertAbove $ \new -> do
@@ -416,13 +430,13 @@ instance (Monad m, MonadRef m, Ref m ~ Ref IO, MonadReflexCreateTrigger t m) =>
416430 newTriggerEventWithOnComplete = do
417431 events <- askEvents
418432 (eResult, reResultTrigger) <- lift newEventWithTriggerRef
419− return $ (,) eResult $ \a cb -> writeChan events [TriggerRef reResultTrigger :=> TriggerInvocation a cb]
433+ return $ (,) eResult $ \a cb -> writeChan events [TriggerRef reResultTrigger :=> TriggerInvocation a (liftIO cb)]
420434 {-# INLINABLE newEventWithLazyTriggerWithOnComplete #-}
421435 newEventWithLazyTriggerWithOnComplete f = do
422436 events <- askEvents
423437 lift $ newEventWithTrigger $ \t -> f $ \a cb -> do
424438 reResultTrigger <- newIORef $ Just t
425− writeChan events [TriggerRef reResultTrigger :=> TriggerInvocation a cb]
439+ writeChan events [TriggerRef reResultTrigger :=> TriggerInvocation a (liftIO cb)]
426440
427441instance HasWebView m => HasWebView (ImmediateDomBuilderT t m) where
428442 type WebViewPhantom (ImmediateDomBuilderT t m) = WebViewPhantom m
@@ -442,7 +456,7 @@ instance MonadAtomicRef m => MonadAtomicRef (ImmediateDomBuilderT t m) where
442456 atomicModifyRef r = lift . atomicModifyRef r
443457
444458instance (HasJS x m, ReflexHost t) => HasJS x (ImmediateDomBuilderT t m) where
445− type JSM (ImmediateDomBuilderT t m) = JSM m
459+ type JSX (ImmediateDomBuilderT t m) = JSX m
446460 liftJS = lift . liftJS
447461
448462type family EventType en where
@@ -643,9 +657,58 @@ withIsEvent en r = case en of
643657 Mousewheel -> r
644658 Wheel -> r
645659
660+showEventName :: EventName en -> String
661+showEventName en = case en of
662+ Abort -> "Abort"
663+ Blur -> "Blur"
664+ Change -> "Change"
665+ Click -> "Click"
666+ Contextmenu -> "Contextmenu"
667+ Dblclick -> "Dblclick"
668+ Drag -> "Drag"
669+ Dragend -> "Dragend"
670+ Dragenter -> "Dragenter"
671+ Dragleave -> "Dragleave"
672+ Dragover -> "Dragover"
673+ Dragstart -> "Dragstart"
674+ Drop -> "Drop"
675+ Error -> "Error"
676+ Focus -> "Focus"
677+ Input -> "Input"
678+ Invalid -> "Invalid"
679+ Keydown -> "Keydown"
680+ Keypress -> "Keypress"
681+ Keyup -> "Keyup"
682+ Load -> "Load"
683+ Mousedown -> "Mousedown"
684+ Mouseenter -> "Mouseenter"
685+ Mouseleave -> "Mouseleave"
686+ Mousemove -> "Mousemove"
687+ Mouseout -> "Mouseout"
688+ Mouseover -> "Mouseover"
689+ Mouseup -> "Mouseup"
690+ Mousewheel -> "Mousewheel"
691+ Scroll -> "Scroll"
692+ Select -> "Select"
693+ Submit -> "Submit"
694+ Wheel -> "Wheel"
695+ Beforecut -> "Beforecut"
696+ Cut -> "Cut"
697+ Beforecopy -> "Beforecopy"
698+ Copy -> "Copy"
699+ Beforepaste -> "Beforepaste"
700+ Paste -> "Paste"
701+ Reset -> "Reset"
702+ Search -> "Search"
703+ Selectstart -> "Selectstart"
704+ Touchstart -> "Touchstart"
705+ Touchmove -> "Touchmove"
706+ Touchend -> "Touchend"
707+ Touchcancel -> "Touchcancel"
708+
646709{-# INLINABLE elementOnEventName #-}
647−elementOnEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
648−elementOnEventName en e = case en of
710+elementOnEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
711+elementOnEventName en e = \x -> liftIO (putStrLn $ "element event handler added " <> showEventName en) >> (case en of
649712 Abort -> on e Element.abort
650713 Blur -> on e Element.blurEvent
651714 Change -> on e Element.change
@@ -691,11 +754,12 @@ elementOnEventName en e = case en of
691754 Touchstart -> on e Element.touchStart
692755 Touchmove -> on e Element.touchMove
693756 Touchend -> on e Element.touchEnd
694− Touchcancel -> on e Element.touchCancel
757+ Touchcancel -> on e Element.touchCancel) (liftIO (putStrLn $ "element event fired " <> showEventName en) >> x)
758+ >>= \y -> return (liftIO (putStrLn $ "element event removed " <> showEventName en) >> y)
695759
696760{-# INLINABLE windowOnEventName #-}
697−windowOnEventName :: EventName en -> DOM.Window -> EventM DOM.Window (EventType en) () -> IO (IO ())
698−windowOnEventName en e = case en of
761+windowOnEventName :: EventName en -> DOM.Window -> EventM DOM.Window (EventType en) () -> JSM (JSM ())
762+windowOnEventName en e = \x -> liftIO (putStrLn $ "window event handler added " <> showEventName en) >> (case en of
699763 Abort -> on e Window.abort
700764 Blur -> on e Window.blurEvent
701765 Change -> on e Window.change
@@ -741,18 +805,19 @@ windowOnEventName en e = case en of
741805 Touchstart -> on e Window.touchStart
742806 Touchmove -> on e Window.touchMove
743807 Touchend -> on e Window.touchEnd
744− Touchcancel -> on e Window.touchCancel
808+ Touchcancel -> on e Window.touchCancel) (liftIO (putStrLn $ "window event fired " <> showEventName en) >> x)
809+ >>= \y -> return (liftIO (putStrLn $ "windo event removed " <> showEventName en) >> y)
745810
746811{-# INLINABLE wrapDomEvent #-}
747−wrapDomEvent :: TriggerEvent t m => e -> (e -> EventM e event () -> IO (IO ())) -> EventM e event a -> m (Event t a)
812+wrapDomEvent :: (TriggerEvent t m, MonadJSM m) => e -> (e -> EventM e event () -> JSM (JSM ())) -> EventM e event a -> m (Event t a)
748813wrapDomEvent el elementOnevent getValue = wrapDomEventMaybe el elementOnevent $ fmap Just getValue
749814
750815{-# INLINABLE subscribeDomEvent #-}
751−subscribeDomEvent :: (EventM e event () -> IO (IO ()))
816+subscribeDomEvent :: (EventM e event () -> JSM (JSM ()))
752817 -> EventM e event (Maybe a)
753818 -> Chan [DSum (TriggerRef t) TriggerInvocation]
754819 -> EventTrigger t a
755− -> IO (IO ())
820+ -> JSM (JSM ())
756821subscribeDomEvent elementOnevent getValue eventChan et = elementOnevent $ do
757822 mv <- getValue
758823 forM_ mv $ \v -> liftIO $ do
@@ -761,25 +826,28 @@ subscribeDomEvent elementOnevent getValue eventChan et = elementOnevent $ do
761826 writeChan eventChan [TriggerRef etr :=> TriggerInvocation v (return ())]
762827
763828{-# INLINABLE wrapDomEventMaybe #-}
764−wrapDomEventMaybe :: TriggerEvent t m
829+wrapDomEventMaybe :: (TriggerEvent t m, MonadJSM m)
765830 => e
766− -> (e -> EventM e event () -> IO (IO ()))
831+ -> (e -> EventM e event () -> JSM (JSM ()))
767832 -> EventM e event (Maybe a)
768833 -> m (Event t a)
769834wrapDomEventMaybe el elementOnevent getValue = do
770− newEventWithLazyTriggerWithOnComplete $ \trigger -> elementOnevent el $ do
835+ ctx <- askJSM
836+ newEventWithLazyTriggerWithOnComplete $ \trigger -> (`runJSM` ctx) <$> (`runJSM` ctx) (elementOnevent el $ do
771837 mv <- getValue
772− forM_ mv $ \v -> liftIO $ trigger v $ return ()
838+ forM_ mv $ \v -> liftIO $ trigger v $ return ())
773839
774840{-# INLINABLE wrapDomEventsMaybe #-}
775−wrapDomEventsMaybe :: (MonadIO m, MonadReflexCreateTrigger t m)
841+wrapDomEventsMaybe :: (MonadJSM m, MonadReflexCreateTrigger t m)
776842 => e
777843 -> (forall en. IsEvent (EventType en) => EventName en -> EventM e (EventType en) (Maybe (f en)))
778− -> (forall en. EventName en -> e -> EventM e (EventType en) () -> IO (IO ()))
844+ -> (forall en. EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ()))
779845 -> ImmediateDomBuilderT t m (EventSelector t (WrapArg f EventName))
780846wrapDomEventsMaybe target handlers onEventName = do
847+ ctx <- askJSM
781848 eventChan <- askEvents
782− e <- lift $ newFanEventWithTrigger $ \(WrapArg en) -> withIsEvent en $ subscribeDomEvent (onEventName en target) (handlers en) eventChan
849+ e <- lift $ newFanEventWithTrigger $ \(WrapArg en) -> withIsEvent en
850+ (((`runJSM` ctx) <$>) . (`runJSM` ctx) . subscribeDomEvent (onEventName en target) (handlers en) eventChan)
783851 return $! e
784852
785853{-# INLINABLE getKeyEvent #-}
@@ -820,7 +888,7 @@ data Window t = Window
820888 , _window_raw :: DOM.Window
821889 }
822890
823−wrapWindow :: (MonadIO m, MonadReflexCreateTrigger t m) => DOM.Window -> WindowConfig t -> ImmediateDomBuilderT t m (Window t)
891+wrapWindow :: (MonadJSM m, MonadReflexCreateTrigger t m) => DOM.Window -> WindowConfig t -> ImmediateDomBuilderT t m (Window t)
824892wrapWindow wv _ = do
825893 events <- wrapDomEventsMaybe wv (defaultDomWindowEventHandler wv) windowOnEventName
826894 return $ Window