@@ -1,3 +1,4 @@
1{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE EmptyDataDecls #-}
4{-# LANGUAGE EmptyDataDecls #-}
@@ -53,9 +54,12 @@ import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
53import GHCJS.DOM.MouseEvent
54import GHCJS.DOM.MouseEvent
54import GHCJS.DOM.Node (appendChild, getOwnerDocument, getParentNode, getPreviousSibling, insertBefore,
55import GHCJS.DOM.Node (appendChild, getOwnerDocument, getParentNode, getPreviousSibling, insertBefore,
55 removeChild, setNodeValue, toNode)
56 removeChild, setNodeValue, toNode)
57+import GHCJS.DOM.Types
58+ (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
56−import GHCJS.DOM.Types (FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node, ToDOMString, TouchEvent,
59+ FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
57− WheelEvent, castToHTMLInputElement, castToHTMLSelectElement,
60+ ToDOMString, TouchEvent, WheelEvent, castToHTMLInputElement,
58− castToHTMLTextAreaElement)
61+ castToHTMLSelectElement, castToHTMLTextAreaElement,
59import qualified GHCJS.DOM.Types as DOM
63import qualified GHCJS.DOM.Types as DOM
60import GHCJS.DOM.UIEvent
64import GHCJS.DOM.UIEvent
61import qualified GHCJS.DOM.Window as Window
65import qualified GHCJS.DOM.Window as Window
@@ -64,7 +68,7 @@ import Debug.Trace hiding (traceEvent)
65data TriggerRef t a = TriggerRef { unTriggerRef :: IORef (Maybe (EventTrigger t a)) }
69data TriggerRef t a = TriggerRef { unTriggerRef :: IORef (Maybe (EventTrigger t a)) }
67−data TriggerInvocation a = TriggerInvocation a (IO ())
71+data TriggerInvocation a = TriggerInvocation a (JSM ())
69data ImmediateDomBuilderEnv t
73data ImmediateDomBuilderEnv t
70 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
74 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
@@ -74,6 +78,11 @@ data ImmediateDomBuilderEnv t
75newtype ImmediateDomBuilderT t m a = ImmediateDomBuilderT { unImmediateDomBuilderT :: ReaderT (ImmediateDomBuilderEnv t) m a } deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException, MonadAsyncException)
79newtype ImmediateDomBuilderT t m a = ImmediateDomBuilderT { unImmediateDomBuilderT :: ReaderT (ImmediateDomBuilderEnv t) m a } deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException, MonadAsyncException)
82+instance MonadJSM m => MonadJSM (ImmediateDomBuilderT t m) where
83+ liftJSM' = ImmediateDomBuilderT . liftJSM'
77instance MonadTransControl (ImmediateDomBuilderT t) where
86instance MonadTransControl (ImmediateDomBuilderT t) where
78 type StT (ImmediateDomBuilderT t) a = StT (ReaderT (ImmediateDomBuilderEnv t)) a
87 type StT (ImmediateDomBuilderT t) a = StT (ReaderT (ImmediateDomBuilderEnv t)) a
79 liftWith = defaultLiftWith ImmediateDomBuilderT unImmediateDomBuilderT
88 liftWith = defaultLiftWith ImmediateDomBuilderT unImmediateDomBuilderT
@@ -99,23 +108,23 @@ askEvents :: Monad m => ImmediateDomBuilderT t m (Chan [DSum (TriggerRef t) Trig
99askEvents = ImmediateDomBuilderT $ asks _immediateDomBuilderEnv_events
108askEvents = ImmediateDomBuilderT $ asks _immediateDomBuilderEnv_events
101{-# INLINABLE append #-}
110{-# INLINABLE append #-}
102−append :: (IsNode n, MonadIO m) => n -> ImmediateDomBuilderT t m ()
111+append :: (IsNode n, MonadJSM m) => n -> ImmediateDomBuilderT t m ()
103append n = do
112append n = do
104 p <- askParent
113 p <- askParent
105− _ <- liftIO $ appendChild p $ Just n
114+ _ <- liftJSM $ appendChild p $ Just n
106 return ()
115 return ()
108{-# INLINABLE textNodeInternal #-}
117{-# 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
110textNodeInternal t = do
119textNodeInternal t = do
111 doc <- askDocument
120 doc <- askDocument
112− Just n <- liftIO $ createTextNode doc t
121+ Just n <- liftJSM $ createTextNode doc t
116-- | s and e must both be children of the same node and s must precede e
125-- | s and e must both be children of the same node and s must precede e
117{-# INLINABLE deleteBetweenInclusive #-}
126{-# INLINABLE deleteBetweenInclusive #-}
118−deleteBetweenInclusive :: (MonadIO m, IsNode start, IsNode end) => start -> end -> m ()
127+deleteBetweenInclusive :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
119deleteBetweenInclusive s e = do
128deleteBetweenInclusive s e = do
120 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
129 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
121 case mCurrentParent of
130 case mCurrentParent of
@@ -124,12 +133,14 @@ deleteBetweenInclusive s e = do
124 let go = do
133 let go = do
125 Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
134 Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
126 _ <- removeChild currentParent $ Just x
135 _ <- removeChild currentParent $ Just x
127− when (toNode s /= toNode x) go
136+ liftJSM (strictEqual s x) >>= \case
129 _ <- removeChild currentParent $ Just e
140 _ <- removeChild currentParent $ Just e
130 return ()
141 return ()
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)
134newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IORef (Maybe (EventTrigger t (er en))))
145newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IORef (Maybe (EventTrigger t (er en))))
@@ -139,35 +150,37 @@ wrap e cfg = do
139 lift $ performEvent_ $ ffor (cfg ^. modifyAttributes) $ imapM_ $ \(AttributeName mAttrNamespace n) mv -> case mAttrNamespace of
150 lift $ performEvent_ $ ffor (cfg ^. modifyAttributes) $ imapM_ $ \(AttributeName mAttrNamespace n) mv -> case mAttrNamespace of
140 Nothing -> maybe (removeAttribute e n) (setAttribute e n) mv
151 Nothing -> maybe (removeAttribute e n) (setAttribute e n) mv
141 Just ns -> maybe (removeAttributeNS e (Just ns) n) (setAttributeNS e (Just ns) n) mv
152 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
153+ eventTriggerRefs :: DMap EventName (EventFilterTriggerRef t er) <- liftJSM $ fmap DMap.fromList $ forM (DMap.toList $ _ghcjsEventSpec_filters $ _rawElementConfig_eventSpec cfg) $ \(en :=> GhcjsEventFilter f) -> do
143− triggerRef <- newIORef Nothing
154+ triggerRef <- liftIO $ newIORef Nothing
144 _ <- elementOnEventName en e $ do
155 _ <- elementOnEventName en e $ do
145 evt <- DOM.event
156 evt <- DOM.event
146− (flags, k) <- liftIO $ f $ GhcjsDomEvent evt
157+ (flags, k) <- liftJSM $ f $ GhcjsDomEvent evt
147 when (_eventFlags_preventDefault flags) $ withIsEvent en DOM.preventDefault
158 when (_eventFlags_preventDefault flags) $ withIsEvent en DOM.preventDefault
148 case _eventFlags_propagation flags of
159 case _eventFlags_propagation flags of
149 Propagation_Continue -> return ()
160 Propagation_Continue -> return ()
150 Propagation_Stop -> withIsEvent en DOM.stopPropagation
161 Propagation_Stop -> withIsEvent en DOM.stopPropagation
151 Propagation_StopImmediate -> withIsEvent en DOM.stopImmediatePropagation
162 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
153 liftIO $ forM_ mv $ \v -> writeChan events [TriggerRef triggerRef :=> TriggerInvocation v (return ())]
164 liftIO $ forM_ mv $ \v -> writeChan events [TriggerRef triggerRef :=> TriggerInvocation v (return ())]
154 return $ en :=> EventFilterTriggerRef triggerRef
165 return $ en :=> EventFilterTriggerRef triggerRef
155− es <- newFanEventWithTrigger $ \(WrapArg en) t -> do
168+ newFanEventWithTrigger $ \(WrapArg en) t ->
156− case DMap.lookup en eventTriggerRefs of
169+ case DMap.lookup en eventTriggerRefs of
157− Just (EventFilterTriggerRef r) -> do
170+ Just (EventFilterTriggerRef r) -> do
158− writeIORef r $ Just t
171+ writeIORef r $ Just t
159− return $ do
172+ return $ do
160− writeIORef r Nothing
173+ writeIORef r Nothing
161− Nothing -> elementOnEventName en e $ do
174+ Nothing -> (`runJSM` ctx) <$> (`runJSM` ctx) (elementOnEventName en e $ do
162− evt <- DOM.event
175+ evt <- DOM.event
163− let h = _ghcjsEventSpec_handler $ _rawElementConfig_eventSpec cfg
176+ let h = _ghcjsEventSpec_handler $ _rawElementConfig_eventSpec cfg
164− mv <- liftIO $ h (en, GhcjsDomEvent evt)
177+ mv <- lift $ h (en, GhcjsDomEvent evt)
165− case mv of
178+ case mv of
166− Nothing -> return ()
179+ Nothing -> return ()
167− Just v -> liftIO $ do
180+ 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
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
169− ref <- newIORef $ Just t
182+ ref <- newIORef $ Just t
170− writeChan events [TriggerRef ref :=> TriggerInvocation v (return ())]
183+ writeChan events [TriggerRef ref :=> TriggerInvocation v (return ())])
171 return $ Element es e
184 return $ Element es e
173{-# INLINABLE makeElement #-}
186{-# INLINABLE makeElement #-}
@@ -175,12 +188,12 @@ makeElement :: forall er t m a. SupportsImmediateDomBuilder t m => Text -> Eleme
175makeElement elementTag cfg child = do
188makeElement elementTag cfg child = do
176 doc <- askDocument
189 doc <- askDocument
177 events <- askEvents
190 events <- askEvents
178− Just e <- ImmediateDomBuilderT $ fmap DOM.castToElement <$> case cfg ^. namespace of
191+ Just e <- liftJSM $ case cfg ^. namespace of
179 Nothing -> createElement doc (Just elementTag)
192 Nothing -> createElement doc (Just elementTag)
180 Just ens -> createElementNS doc (Just ens) (Just elementTag)
193 Just ens -> createElementNS doc (Just ens) (Just elementTag)
181 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
194 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
182− Nothing -> setAttribute e n v
195+ Nothing -> lift $ setAttribute e n v
183− Just ans -> setAttributeNS e (Just ans) n v
196+ Just ans -> lift $ setAttributeNS e (Just ans) n v
184 result <- lift $ runImmediateDomBuilderT child $ ImmediateDomBuilderEnv
197 result <- lift $ runImmediateDomBuilderT child $ ImmediateDomBuilderEnv
185 { _immediateDomBuilderEnv_parent = toNode e
198 { _immediateDomBuilderEnv_parent = toNode e
186 , _immediateDomBuilderEnv_document = doc
199 , _immediateDomBuilderEnv_document = doc
@@ -190,9 +203,9 @@ makeElement elementTag cfg child = do
190 wrapped <- wrap e $ extractRawElementConfig cfg
203 wrapped <- wrap e $ extractRawElementConfig cfg
191 return ((wrapped, result), e)
204 return ((wrapped, result), e)
193−newtype GhcjsDomHandler a b = GhcjsDomHandler { unGhcjsDomHandler :: a -> IO b }
206+newtype GhcjsDomHandler a b = GhcjsDomHandler { unGhcjsDomHandler :: a -> JSM b }
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) }
197newtype GhcjsDomEvent en = GhcjsDomEvent { unGhcjsDomEvent :: EventType en }
210newtype GhcjsDomEvent en = GhcjsDomEvent { unGhcjsDomEvent :: EventType en }
@@ -220,7 +233,7 @@ instance DomSpace GhcjsDomSpace where
220 in DMap.alter f' en $ _ghcjsEventSpec_filters es
233 in DMap.alter f' en $ _ghcjsEventSpec_filters es
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))))
225data Pair1 (f :: k -> *) (g :: k -> *) (a :: k) = Pair1 (f a) (g a)
238data Pair1 (f :: k -> *) (g :: k -> *) (a :: k) = Pair1 (f a) (g a)
@@ -228,7 +241,7 @@ data Maybe1 f a = Nothing1 | Just1 (f a)
229data GhcjsEventSpec er = GhcjsEventSpec
242data GhcjsEventSpec er = GhcjsEventSpec
230 { _ghcjsEventSpec_filters :: DMap EventName (GhcjsEventFilter er)
243 { _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))
234instance er ~ EventResult => Default (GhcjsEventSpec er) where
247instance er ~ EventResult => Default (GhcjsEventSpec er) where
@@ -236,7 +249,8 @@ instance er ~ EventResult => Default (GhcjsEventSpec er) where
236 { _ghcjsEventSpec_filters = mempty
249 { _ghcjsEventSpec_filters = mempty
237 , _ghcjsEventSpec_handler = \(en, GhcjsDomEvent evt) -> do
250 , _ghcjsEventSpec_handler = \(en, GhcjsDomEvent evt) -> do
238 Just t <- withIsEvent en $ Event.getTarget evt --TODO: Rework this; defaultDomEventHandler shouldn't need to take this as an argument
251 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
242instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t m) where
256instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t m) where
@@ -260,7 +274,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
260 {-# INLINABLE inputElement #-}
274 {-# INLINABLE inputElement #-}
261 inputElement cfg = do
275 inputElement cfg = do
262 ((e, _), domElement) <- makeElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
276 ((e, _), domElement) <- makeElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
263− let domInputElement = castToHTMLInputElement domElement
277+ domInputElement <- liftJSM $ castToHTMLInputElement domElement
264 Input.setValue domInputElement $ Just (cfg ^. inputElementConfig_initialValue)
278 Input.setValue domInputElement $ Just (cfg ^. inputElementConfig_initialValue)
265 Just v0 <- Input.getValue domInputElement
279 Just v0 <- Input.getValue domInputElement
266 let getMyValue = fromMaybe "" <$> Input.getValue domInputElement
280 let getMyValue = fromMaybe "" <$> Input.getValue domInputElement
@@ -307,7 +321,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
307 {-# INLINABLE textAreaElement #-}
321 {-# INLINABLE textAreaElement #-}
308 textAreaElement cfg = do --TODO
322 textAreaElement cfg = do --TODO
309 ((e, _), domElement) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
323 ((e, _), domElement) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
310− let domTextAreaElement = castToHTMLTextAreaElement domElement
324+ domTextAreaElement <- liftJSM $ castToHTMLTextAreaElement domElement
311 TextArea.setValue domTextAreaElement $ Just (cfg ^. textAreaElementConfig_initialValue)
325 TextArea.setValue domTextAreaElement $ Just (cfg ^. textAreaElementConfig_initialValue)
312 Just v0 <- TextArea.getValue domTextAreaElement
326 Just v0 <- TextArea.getValue domTextAreaElement
313 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
327 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
@@ -330,7 +344,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
330 {-# INLINABLE selectElement #-}
344 {-# INLINABLE selectElement #-}
331 selectElement cfg child = do
345 selectElement cfg child = do
332 ((e, result), domElement) <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
346 ((e, result), domElement) <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
333− let domSelectElement = castToHTMLSelectElement domElement
347+ domSelectElement <- liftJSM $ castToHTMLSelectElement domElement
334 Select.setValue domSelectElement $ Just (cfg ^. selectElementConfig_initialValue)
348 Select.setValue domSelectElement $ Just (cfg ^. selectElementConfig_initialValue)
335 Just v0 <- Select.getValue domSelectElement
349 Just v0 <- Select.getValue domSelectElement
336 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
350 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
@@ -363,7 +377,7 @@ mkHasFocus e = do
365{-# INLINABLE insertImmediateAbove #-}
379{-# 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)
367insertImmediateAbove n toInsertAbove = do
381insertImmediateAbove n toInsertAbove = do
368 events <- askEvents
382 events <- askEvents
369 lift $ performEvent $ ffor toInsertAbove $ \new -> do
383 lift $ performEvent $ ffor toInsertAbove $ \new -> do
@@ -416,13 +430,13 @@ instance (Monad m, MonadRef m, Ref m ~ Ref IO, MonadReflexCreateTrigger t m) =>
416 newTriggerEventWithOnComplete = do
430 newTriggerEventWithOnComplete = do
417 events <- askEvents
431 events <- askEvents
418 (eResult, reResultTrigger) <- lift newEventWithTriggerRef
432 (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)]
420 {-# INLINABLE newEventWithLazyTriggerWithOnComplete #-}
434 {-# INLINABLE newEventWithLazyTriggerWithOnComplete #-}
421 newEventWithLazyTriggerWithOnComplete f = do
435 newEventWithLazyTriggerWithOnComplete f = do
422 events <- askEvents
436 events <- askEvents
423 lift $ newEventWithTrigger $ \t -> f $ \a cb -> do
437 lift $ newEventWithTrigger $ \t -> f $ \a cb -> do
424 reResultTrigger <- newIORef $ Just t
438 reResultTrigger <- newIORef $ Just t
425− writeChan events [TriggerRef reResultTrigger :=> TriggerInvocation a cb]
439+ writeChan events [TriggerRef reResultTrigger :=> TriggerInvocation a (liftIO cb)]
427instance HasWebView m => HasWebView (ImmediateDomBuilderT t m) where
441instance HasWebView m => HasWebView (ImmediateDomBuilderT t m) where
428 type WebViewPhantom (ImmediateDomBuilderT t m) = WebViewPhantom m
442 type WebViewPhantom (ImmediateDomBuilderT t m) = WebViewPhantom m
@@ -442,7 +456,7 @@ instance MonadAtomicRef m => MonadAtomicRef (ImmediateDomBuilderT t m) where
442 atomicModifyRef r = lift . atomicModifyRef r
456 atomicModifyRef r = lift . atomicModifyRef r
444instance (HasJS x m, ReflexHost t) => HasJS x (ImmediateDomBuilderT t m) where
458instance (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
446 liftJS = lift . liftJS
460 liftJS = lift . liftJS
448type family EventType en where
462type family EventType en where
@@ -643,9 +657,58 @@ withIsEvent en r = case en of
643 Mousewheel -> r
657 Mousewheel -> r
644 Wheel -> r
658 Wheel -> r
660+showEventName :: EventName en -> String
661+showEventName en = case en of
666+ Contextmenu -> "Contextmenu"
667+ Dblclick -> "Dblclick"
669+ Dragend -> "Dragend"
670+ Dragenter -> "Dragenter"
671+ Dragleave -> "Dragleave"
672+ Dragover -> "Dragover"
673+ Dragstart -> "Dragstart"
678+ Invalid -> "Invalid"
679+ Keydown -> "Keydown"
680+ Keypress -> "Keypress"
683+ Mousedown -> "Mousedown"
684+ Mouseenter -> "Mouseenter"
685+ Mouseleave -> "Mouseleave"
686+ Mousemove -> "Mousemove"
687+ Mouseout -> "Mouseout"
688+ Mouseover -> "Mouseover"
689+ Mouseup -> "Mouseup"
690+ Mousewheel -> "Mousewheel"
695+ Beforecut -> "Beforecut"
697+ Beforecopy -> "Beforecopy"
699+ Beforepaste -> "Beforepaste"
703+ Selectstart -> "Selectstart"
704+ Touchstart -> "Touchstart"
705+ Touchmove -> "Touchmove"
706+ Touchend -> "Touchend"
707+ Touchcancel -> "Touchcancel"
646{-# INLINABLE elementOnEventName #-}
709{-# INLINABLE elementOnEventName #-}
647−elementOnEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
710+elementOnEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> JSM (JSM ())
648−elementOnEventName en e = case en of
711+elementOnEventName en e = \x -> liftIO (putStrLn $ "element event handler added " <> showEventName en) >> (case en of
649 Abort -> on e Element.abort
712 Abort -> on e Element.abort
650 Blur -> on e Element.blurEvent
713 Blur -> on e Element.blurEvent
651 Change -> on e Element.change
714 Change -> on e Element.change
@@ -691,11 +754,12 @@ elementOnEventName en e = case en of
691 Touchstart -> on e Element.touchStart
754 Touchstart -> on e Element.touchStart
692 Touchmove -> on e Element.touchMove
755 Touchmove -> on e Element.touchMove
693 Touchend -> on e Element.touchEnd
756 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)
696{-# INLINABLE windowOnEventName #-}
760{-# INLINABLE windowOnEventName #-}
697−windowOnEventName :: EventName en -> DOM.Window -> EventM DOM.Window (EventType en) () -> IO (IO ())
761+windowOnEventName :: EventName en -> DOM.Window -> EventM DOM.Window (EventType en) () -> JSM (JSM ())
698−windowOnEventName en e = case en of
762+windowOnEventName en e = \x -> liftIO (putStrLn $ "window event handler added " <> showEventName en) >> (case en of
699 Abort -> on e Window.abort
763 Abort -> on e Window.abort
700 Blur -> on e Window.blurEvent
764 Blur -> on e Window.blurEvent
701 Change -> on e Window.change
765 Change -> on e Window.change
@@ -741,18 +805,19 @@ windowOnEventName en e = case en of
741 Touchstart -> on e Window.touchStart
805 Touchstart -> on e Window.touchStart
742 Touchmove -> on e Window.touchMove
806 Touchmove -> on e Window.touchMove
743 Touchend -> on e Window.touchEnd
807 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)
746{-# INLINABLE wrapDomEvent #-}
811{-# 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)
748wrapDomEvent el elementOnevent getValue = wrapDomEventMaybe el elementOnevent $ fmap Just getValue
813wrapDomEvent el elementOnevent getValue = wrapDomEventMaybe el elementOnevent $ fmap Just getValue
750{-# INLINABLE subscribeDomEvent #-}
815{-# INLINABLE subscribeDomEvent #-}
751−subscribeDomEvent :: (EventM e event () -> IO (IO ()))
816+subscribeDomEvent :: (EventM e event () -> JSM (JSM ()))
752 -> EventM e event (Maybe a)
817 -> EventM e event (Maybe a)
753 -> Chan [DSum (TriggerRef t) TriggerInvocation]
818 -> Chan [DSum (TriggerRef t) TriggerInvocation]
754 -> EventTrigger t a
819 -> EventTrigger t a
755− -> IO (IO ())
820+ -> JSM (JSM ())
756subscribeDomEvent elementOnevent getValue eventChan et = elementOnevent $ do
821subscribeDomEvent elementOnevent getValue eventChan et = elementOnevent $ do
757 mv <- getValue
822 mv <- getValue
758 forM_ mv $ \v -> liftIO $ do
823 forM_ mv $ \v -> liftIO $ do
@@ -761,25 +826,28 @@ subscribeDomEvent elementOnevent getValue eventChan et = elementOnevent $ do
761 writeChan eventChan [TriggerRef etr :=> TriggerInvocation v (return ())]
826 writeChan eventChan [TriggerRef etr :=> TriggerInvocation v (return ())]
763{-# INLINABLE wrapDomEventMaybe #-}
828{-# INLINABLE wrapDomEventMaybe #-}
764−wrapDomEventMaybe :: TriggerEvent t m
829+wrapDomEventMaybe :: (TriggerEvent t m, MonadJSM m)
766− -> (e -> EventM e event () -> IO (IO ()))
831+ -> (e -> EventM e event () -> JSM (JSM ()))
767 -> EventM e event (Maybe a)
832 -> EventM e event (Maybe a)
768 -> m (Event t a)
833 -> m (Event t a)
769wrapDomEventMaybe el elementOnevent getValue = do
834wrapDomEventMaybe el elementOnevent getValue = do
770− newEventWithLazyTriggerWithOnComplete $ \trigger -> elementOnevent el $ do
836+ newEventWithLazyTriggerWithOnComplete $ \trigger -> (`runJSM` ctx) <$> (`runJSM` ctx) (elementOnevent el $ do
771 mv <- getValue
837 mv <- getValue
772− forM_ mv $ \v -> liftIO $ trigger v $ return ()
838+ forM_ mv $ \v -> liftIO $ trigger v $ return ())
774{-# INLINABLE wrapDomEventsMaybe #-}
840{-# INLINABLE wrapDomEventsMaybe #-}
775−wrapDomEventsMaybe :: (MonadIO m, MonadReflexCreateTrigger t m)
841+wrapDomEventsMaybe :: (MonadJSM m, MonadReflexCreateTrigger t m)
777 -> (forall en. IsEvent (EventType en) => EventName en -> EventM e (EventType en) (Maybe (f en)))
843 -> (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 ()))
779 -> ImmediateDomBuilderT t m (EventSelector t (WrapArg f EventName))
845 -> ImmediateDomBuilderT t m (EventSelector t (WrapArg f EventName))
780wrapDomEventsMaybe target handlers onEventName = do
846wrapDomEventsMaybe target handlers onEventName = do
781 eventChan <- askEvents
848 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)
783 return $! e
851 return $! e
785{-# INLINABLE getKeyEvent #-}
853{-# INLINABLE getKeyEvent #-}
@@ -820,7 +888,7 @@ data Window t = Window
820 , _window_raw :: DOM.Window
888 , _window_raw :: DOM.Window
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)
824wrapWindow wv _ = do
892wrapWindow wv _ = do
825 events <- wrapDomEventsMaybe wv (defaultDomWindowEventHandler wv) windowOnEventName
893 events <- wrapDomEventsMaybe wv (defaultDomWindowEventHandler wv) windowOnEventName
826 return $ Window
894 return $ Window