@@ -24,6 +24,8 @@ import Reflex.Dynamic
24import Reflex.Host.Class
24import Reflex.Host.Class
25import Reflex.PerformEvent.Class
25import Reflex.PerformEvent.Class
26import Reflex.PostBuild.Class
26import Reflex.PostBuild.Class
27+import Reflex.TriggerEvent.Class
28+import Reflex.TriggerEvent.Base hiding (askEvents)
28import Control.Concurrent.Chan
30import Control.Concurrent.Chan
29import Control.Lens hiding (element)
31import Control.Lens hiding (element)
@@ -58,8 +60,9 @@ import qualified GHCJS.DOM.HTMLInputElement as Input
58import qualified GHCJS.DOM.HTMLSelectElement as Select
60import qualified GHCJS.DOM.HTMLSelectElement as Select
59import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
61import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
60import GHCJS.DOM.MouseEvent
62import GHCJS.DOM.MouseEvent
61−import GHCJS.DOM.Node (appendChild, getOwnerDocument, getParentNode, getPreviousSibling, insertBefore,
63+import GHCJS.DOM.Node (appendChild, getOwnerDocument, getParentNode, getPreviousSibling,
62 removeChild, setNodeValue, toNode)
64 removeChild, setNodeValue, toNode)
65+import qualified GHCJS.DOM.Node as DOM (insertBefore)
63import GHCJS.DOM.Types
66import GHCJS.DOM.Types
64 (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
67 (liftJSM, askJSM, runJSM, JSM, MonadJSM(..),
65 FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
68 FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
@@ -72,8 +75,6 @@ import Debug.Trace hiding (traceEvent)
73data TriggerRef t a = TriggerRef { unTriggerRef :: IORef (Maybe (EventTrigger t a)) }
76data TriggerRef t a = TriggerRef { unTriggerRef :: IORef (Maybe (EventTrigger t a)) }
75−data TriggerInvocation a = TriggerInvocation a (JSM ())
77data ImmediateDomBuilderEnv t
78data ImmediateDomBuilderEnv t
78 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
79 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
79 , _immediateDomBuilderEnv_parent :: Node
80 , _immediateDomBuilderEnv_parent :: Node
@@ -143,7 +144,7 @@ deleteBetweenInclusive s e = do
143 return ()
144 return ()
145-- | s and e must both be children of the same node and s must precede e
146-- | s and e must both be children of the same node and s must precede e
146−deleteBetweenExclusive :: (MonadIO m, IsNode start, IsNode end) => start -> end -> m ()
147+deleteBetweenExclusive :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
147deleteBetweenExclusive s e = do
148deleteBetweenExclusive s e = do
148 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
149 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
149 case mCurrentParent of
150 case mCurrentParent of
@@ -161,7 +162,7 @@ deleteBetweenExclusive s e = do
162-- | s and e must both be children of the same node and s must precede e; s and all nodes between s and e will be removed, but e will not be removed
163-- | s and e must both be children of the same node and s must precede e; s and all nodes between s and e will be removed, but e will not be removed
163{-# INLINABLE deleteUpTo #-}
164{-# INLINABLE deleteUpTo #-}
164−deleteUpTo :: (MonadIO m, IsNode start, IsNode end) => start -> end -> m ()
165+deleteUpTo :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m ()
165deleteUpTo s e = do
166deleteUpTo s e = do
166 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
167 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
167 case mCurrentParent of
168 case mCurrentParent of
@@ -169,14 +170,16 @@ deleteUpTo s e = do
169 Just currentParent -> deleteUpToGivenParent currentParent s e
170 Just currentParent -> deleteUpToGivenParent currentParent s e
171{-# INLINABLE deleteUpToGivenParent #-}
172{-# INLINABLE deleteUpToGivenParent #-}
172−deleteUpToGivenParent :: (MonadIO m, IsNode parent, IsNode start, IsNode end) => parent -> start -> end -> m ()
173+deleteUpToGivenParent :: (MonadJSM m, IsNode parent, IsNode start, IsNode end) => parent -> start -> end -> m ()
173deleteUpToGivenParent currentParent s e = do
174deleteUpToGivenParent currentParent s e = do
174 fix $ \loop -> do
175 fix $ \loop -> do
175 Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
176 Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
176 _ <- removeChild currentParent $ Just x
177 _ <- removeChild currentParent $ Just x
177− when (toNode s /= toNode x) loop
178+ liftJSM (strictEqual s x) >>= \case
179−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)
182+type SupportsImmediateDomBuilder t m = (Reflex t, MonadJSM m, MonadJSM (Performable m), MonadHold t m, MonadFix m, PerformEvent t m, MonadReflexCreateTrigger t m, MonadRef m, Ref m ~ Ref JSM, MonadAdjust t m)
181newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IORef (Maybe (EventTrigger t (er en))))
184newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IORef (Maybe (EventTrigger t (er en))))
@@ -417,7 +420,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
417 placeRawElement = append
420 placeRawElement = append
418 wrapRawElement = wrap
421 wrapRawElement = wrap
420−instance (Reflex t, MonadAdjust t m, MonadIO m, MonadHold t m, PerformEvent t m, MonadIO (Performable m)) => MonadAdjust t (ImmediateDomBuilderT t m) where
423+instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m, MonadJSM (Performable m)) => MonadAdjust t (ImmediateDomBuilderT t m) where
421 runWithReplace a0 a' = do
424 runWithReplace a0 a' = do
422 initialEnv <- ImmediateDomBuilderT ask
425 initialEnv <- ImmediateDomBuilderT ask
423 before <- textNodeInternal ("" :: Text)
426 before <- textNodeInternal ("" :: Text)