@@ -13,13 +13,70 @@
1313{-# LANGUAGE RankNTypes #-}
1414{-# LANGUAGE RecursiveDo #-}
1515{-# LANGUAGE ScopedTypeVariables #-}
16+{-# LANGUAGE StandaloneDeriving #-}
1617#ifdef USE_TEMPLATE_HASKELL
1718{-# LANGUAGE TemplateHaskell #-}
1819#endif
1920{-# LANGUAGE TypeFamilies #-}
2021{-# LANGUAGE TypeOperators #-}
2122{-# LANGUAGE UndecidableInstances #-}
22−module Reflex.Dom.Builder.Immediate where
23+module Reflex.Dom.Builder.Immediate
24+ ( TriggerRef (..)
25+ , ImmediateDomBuilderEnv (..)
26+ , ImmediateDomBuilderT (..)
27+ , runImmediateDomBuilderT
28+ , askDocument
29+ , askParent
30+ , askEvents
31+ , append
32+ , textNodeInternal
33+ , deleteBetweenExclusive
34+ , extractBetweenExclusive
35+ , deleteUpTo
36+ , extractUpTo
37+ , SupportsImmediateDomBuilder
38+ , collectUpTo
39+ , collectUpToGivenParent
40+ , EventFilterTriggerRef (..)
41+ , wrap
42+ , makeElement
43+ , GhcjsDomHandler (..)
44+ , GhcjsDomHandler1 (..)
45+ , GhcjsDomEvent (..)
46+ , GhcjsDomSpace
47+ , GhcjsEventFilter (..)
48+ , Pair1 (..)
49+ , Maybe1 (..)
50+ , GhcjsEventSpec (..)
51+ , GhcjsEventHandler (..)
52+#ifndef USE_TEMPLATE_HASKELL
53+ , phantom2
54+ , ghcjsEventSpec_filters
55+ , ghcjsEventSpec_handler
56+#endif
57+ , drawChildUpdate
58+ , mkHasFocus
59+ , insertBefore
60+ , EventType
61+ , defaultDomEventHandler
62+ , defaultDomWindowEventHandler
63+ , withIsEvent
64+ , showEventName
65+ , elementOnEventName
66+ , windowOnEventName
67+ , wrapDomEvent
68+ , subscribeDomEvent
69+ , wrapDomEventMaybe
70+ , wrapDomEventsMaybe
71+ , getKeyEvent
72+ , getMouseEventCoords
73+ , getTouchEvent
74+ , WindowConfig (..)
75+ , Window (..)
76+ , wrapWindow
77+ , ghcjsEventSpec_filters
78+ , ghcjsEventSpec_handler
79+ ) where
2380
2481import Foreign.JavaScript.TH
2582import Reflex.Class as Reflex
@@ -37,7 +94,6 @@ import Control.Monad.Exception
3794import Control.Monad.Primitive
3895import Control.Monad.Reader
3996import Control.Monad.Ref
40−import Control.Monad.Trans.Control
4197#ifndef USE_TEMPLATE_HASKELL
4298import Data.Functor.Contravariant (phantom)
4399#endif
@@ -81,15 +137,18 @@ import GHCJS.DOM.UIEvent
81137import qualified GHCJS.DOM.Window as Window
82138import Language.Javascript.JSaddle (call, eval)
83139
140+import Reflex.Requester.Base
141+import Reflex.Requester.Class
142+
84143data TriggerRef t a = TriggerRef { unTriggerRef :: IORef (Maybe (EventTrigger t a)) }
85144
86−data ImmediateDomBuilderEnv t
145+data ImmediateDomBuilderEnv t m
87146 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
88147 , _immediateDomBuilderEnv_parent :: Node
89148 , _immediateDomBuilderEnv_events :: Chan [DSum (TriggerRef t) TriggerInvocation]
90149 }
91150
92−newtype ImmediateDomBuilderT t m a = ImmediateDomBuilderT { unImmediateDomBuilderT :: ReaderT (ImmediateDomBuilderEnv t) m a } deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException, MonadAsyncException)
151+newtype ImmediateDomBuilderT t m a = ImmediateDomBuilderT { unImmediateDomBuilderT :: ReaderT (ImmediateDomBuilderEnv t m) (RequesterT t JSM Identity m) a } deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException, MonadAsyncException)
93152
94153#ifndef __GHCJS__
95154instance MonadJSM m => MonadJSM (ImmediateDomBuilderT t m) where
@@ -100,17 +159,28 @@ instance PrimMonad m => PrimMonad (ImmediateDomBuilderT x m) where
100159 type PrimState (ImmediateDomBuilderT x m) = PrimState m
101160 primitive = lift . primitive
102161
103−instance MonadTransControl (ImmediateDomBuilderT t) where
104− type StT (ImmediateDomBuilderT t) a = StT (ReaderT (ImmediateDomBuilderEnv t)) a
105− liftWith = defaultLiftWith ImmediateDomBuilderT unImmediateDomBuilderT
106− restoreT = defaultRestoreT ImmediateDomBuilderT
107−
108162instance MonadTrans (ImmediateDomBuilderT t) where
109− lift = ImmediateDomBuilderT . lift
163+ lift = ImmediateDomBuilderT . lift . lift
164+
165+instance (PerformEvent t m, PrimMonad m) => DomRenderHook (ImmediateDomBuilderT t m) where
166+ withRenderHook hook (ImmediateDomBuilderT a) = do
167+ e <- ImmediateDomBuilderT ask
168+ ImmediateDomBuilderT $ lift $ withRequesting $ \rsp -> do
169+ (x, req) <- lift $ runRequesterT (runReaderT a e) $ runIdentity <$> rsp
170+ return (ffor req $ \rm -> hook $ DMap.traverseWithKey (\_ r -> Identity <$> r) rm, x)
171+
172+requestDomAction :: (Reflex t, Monad m, PrimMonad m) => Event t (JSM a) -> ImmediateDomBuilderT t m (Event t a)
173+requestDomAction = ImmediateDomBuilderT . lift . requestingIdentity
174+
175+requestDomAction_ :: (Reflex t, Monad m, PrimMonad m) => Event t (JSM a) -> ImmediateDomBuilderT t m ()
176+requestDomAction_ = ImmediateDomBuilderT . lift . requesting_
110177
111178{-# INLINABLE runImmediateDomBuilderT #-}
112−runImmediateDomBuilderT :: ImmediateDomBuilderT t m a -> ImmediateDomBuilderEnv t -> m a
113−runImmediateDomBuilderT (ImmediateDomBuilderT a) = runReaderT a
179+runImmediateDomBuilderT :: (Reflex t, MonadFix m, PerformEvent t m, MonadJSM (Performable m)) => ImmediateDomBuilderT t m a -> ImmediateDomBuilderEnv t m -> m a
180+runImmediateDomBuilderT (ImmediateDomBuilderT a) env = do
181+ rec (x, req) <- runRequesterT (runReaderT a env) rsp
182+ rsp <- performEvent $ ffor req $ \rm -> liftJSM $ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
183+ return x
114184
115185{-# INLINABLE askDocument #-}
116186askDocument :: Monad m => ImmediateDomBuilderT t m Document
@@ -187,7 +257,7 @@ extractUpTo df s e = liftJSM $ do
187257 ]
188258 void $ call f f (df, s, e)
189259
190−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)
260+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, PrimMonad m)
191261
192262{-# INLINABLE collectUpTo #-}
193263collectUpTo :: (MonadJSM m, IsNode start, IsNode end) => start -> end -> m DOM.DocumentFragment
@@ -208,7 +278,7 @@ newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IOR
208278wrap :: forall m er t. SupportsImmediateDomBuilder t m => RawElement GhcjsDomSpace -> RawElementConfig er t (ImmediateDomBuilderT t m) -> ImmediateDomBuilderT t m (Element er GhcjsDomSpace t)
209279wrap e cfg = do
210280 events <- askEvents
211− mapM_ (performEvent_ . fmap (imapM_ $ \(AttributeName mAttrNamespace n) mv -> case mAttrNamespace of
281+ mapM_ (requestDomAction_ . fmap (imapM_ $ \(AttributeName mAttrNamespace n) mv -> case mAttrNamespace of
212282 Nothing -> maybe (removeAttribute e n) (setAttribute e n) mv
213283 Just ns -> maybe (removeAttributeNS e (Just ns) n) (setAttributeNS e (Just ns) n) mv)) (_rawElementConfig_modifyAttributes cfg)
214284 eventTriggerRefs :: DMap EventName (EventFilterTriggerRef t er) <- liftJSM $ fmap DMap.fromList $ forM (DMap.toList $ _ghcjsEventSpec_filters $ _rawElementConfig_eventSpec cfg) $ \(en :=> GhcjsEventFilter f) -> do
@@ -249,17 +319,15 @@ wrap e cfg = do
249319makeElement :: forall er t m a. SupportsImmediateDomBuilder t m => Text -> ElementConfig er t (ImmediateDomBuilderT t m) -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.Element)
250320makeElement elementTag cfg child = do
251321 doc <- askDocument
252− events <- askEvents
322+ env <- ImmediateDomBuilderT ask
253323 e <- liftJSM $ case cfg ^. namespace of
254324 Nothing -> createElementUnchecked doc (Just elementTag)
255325 Just ens -> createElementNSUnchecked doc (Just ens) (Just elementTag)
256326 ImmediateDomBuilderT $ iforM_ (cfg ^. initialAttributes) $ \(AttributeName mAttrNamespace n) v -> case mAttrNamespace of
257327 Nothing -> lift $ setAttribute e n v
258328 Just ans -> lift $ setAttributeNS e (Just ans) n v
259− result <- lift $ runImmediateDomBuilderT child $ ImmediateDomBuilderEnv
329+ result <- ImmediateDomBuilderT $ lift $ runReaderT (unImmediateDomBuilderT child) $ env
260330 { _immediateDomBuilderEnv_parent = toNode e
261− , _immediateDomBuilderEnv_document = doc
262− , _immediateDomBuilderEnv_events = events
263331 }
264332 append e
265333 wrapped <- wrap e $ extractRawElementConfig cfg
@@ -335,7 +403,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
335403 {-# INLINABLE textNode #-}
336404 textNode (TextNodeConfig initialContents mSetContents) = do
337405 n <- textNodeInternal initialContents
338− mapM_ (lift . performEvent_ . fmap (setNodeValue n . Just)) mSetContents
406+ mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
339407 return $ TextNode n
340408 {-# INLINABLE element #-}
341409 element elementTag cfg child = fst <$> makeElement elementTag cfg child
@@ -346,10 +414,10 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
346414 Input.setValue domInputElement $ Just (cfg ^. inputElementConfig_initialValue)
347415 v0 <- Input.getValueUnchecked domInputElement
348416 let getMyValue = fromMaybe "" <$> Input.getValue domInputElement
349− valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
417+ valueChangedByUI <- performEvent $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
350418 valueChangedBySetValue <- case _inputElementConfig_setValue cfg of
351419 Nothing -> return never
352− Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
420+ Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
353421 Input.setValue domInputElement $ Just v'
354422 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
355423 v <- holdDyn v0 $ leftmost
@@ -361,7 +429,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
361429 Input.getChecked domInputElement
362430 checkedChangedBySetChecked <- case _inputElementConfig_setChecked cfg of
363431 Nothing -> return never
364− Just eNewchecked -> performEvent $ ffor eNewchecked $ \newChecked -> do
432+ Just eNewchecked -> requestDomAction $ ffor eNewchecked $ \newChecked -> do
365433 oldChecked <- Input.getChecked domInputElement
366434 Input.setChecked domInputElement newChecked
367435 return $ if newChecked /= oldChecked
@@ -397,10 +465,10 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
397465 TextArea.setValue domTextAreaElement $ Just (cfg ^. textAreaElementConfig_initialValue)
398466 v0 <- TextArea.getValueUnchecked domTextAreaElement
399467 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
400− valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
468+ valueChangedByUI <- performEvent $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
401469 valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
402470 Nothing -> return never
403− Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
471+ Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
404472 TextArea.setValue domTextAreaElement $ Just v'
405473 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
406474 v <- holdDyn v0 $ leftmost
@@ -422,10 +490,10 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
422490 Select.setValue domSelectElement $ Just (cfg ^. selectElementConfig_initialValue)
423491 Just v0 <- Select.getValue domSelectElement
424492 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
425− valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
493+ valueChangedByUI <- performEvent $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
426494 valueChangedBySetValue <- case _selectElementConfig_setValue cfg of
427495 Nothing -> return never
428− Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
496+ Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
429497 Select.setValue domSelectElement $ Just v'
430498 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
431499 v <- holdDyn v0 $ leftmost
@@ -444,7 +512,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
444512 placeRawElement = append
445513 wrapRawElement = wrap
446514
447−instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m, MonadJSM (Performable m)) => MonadAdjust t (ImmediateDomBuilderT t m) where
515+instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m, MonadJSM (Performable m), MonadFix m, PrimMonad m) => MonadAdjust t (ImmediateDomBuilderT t m) where
448516 runWithReplace a0 a' = do
449517 initialEnv <- ImmediateDomBuilderT ask
450518 before <- textNodeInternal ("" :: Text)
@@ -454,9 +522,9 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
454522 result <- a0
455523 append after
456524 return result
457− (result0, result') <- lift $ runWithReplace (runImmediateDomBuilderT drawInitialChild initialEnv) $ ffor a' $ \child -> do
525+ (result0, result') <- ImmediateDomBuilderT $ lift $ runWithReplace (runReaderT (unImmediateDomBuilderT drawInitialChild) initialEnv) $ ffor a' $ \child -> do
458526 df <- createDocumentFragmentUnchecked $ _immediateDomBuilderEnv_document initialEnv
459− result <- runImmediateDomBuilderT child $ initialEnv
527+ result <- runReaderT (unImmediateDomBuilderT child) $ initialEnv
460528 { _immediateDomBuilderEnv_parent = toNode df
461529 }
462530 deleteBetweenExclusive before after
@@ -465,7 +533,7 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
465533 return (result0, result')
466534 traverseDMapWithKeyWithAdjust (f :: forall a. k a -> v a -> ImmediateDomBuilderT t m (v' a)) (dm0 :: DMap k v) dm' = do
467535 initialEnv <- ImmediateDomBuilderT ask
468− (children0, children') <- lift $ traverseDMapWithKeyWithAdjust (\k v -> drawChildUpdate initialEnv $ f k v) dm0 dm'
536+ (children0, children') <- ImmediateDomBuilderT $ lift $ traverseDMapWithKeyWithAdjust (\k v -> drawChildUpdate initialEnv $ f k v) dm0 dm'
469537 let result0 = DMap.map (\(Compose (_, _, v)) -> v) children0
470538 placeholders0 = weakenDMapWith (\(Compose (_, ph, _)) -> ph) children0
471539 result' = ffor children' $ mapPatchDMap $ \(Compose (_, _, r)) -> r
@@ -473,10 +541,10 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
473541 placeholders <- current . incrementalToDynamic <$> holdIncremental placeholders0 placeholders'
474542 _ <- DMap.traverseWithKey (\_ (Compose (df, _, _)) -> Constant () <$ append df) children0
475543 lastPlaceholder <- textNodeInternal ("" :: Text)
476− performEvent_ $ flip push children' $ \(PatchDMap p) -> do
544+ requestDomAction_ $ flip push children' $ \(PatchDMap p) -> do
477545 phs <- sample placeholders
478546 if DMap.null p then return Nothing else return $ Just $ do
479− let g :: DSum k (ComposeMaybe (Compose ((,,) DOM.DocumentFragment DOM.Text) v')) -> Performable m ()
547+ let g :: DSum k (ComposeMaybe (Compose ((,,) DOM.DocumentFragment DOM.Text) v')) -> JSM ()
480548 g (k :=> ComposeMaybe mv) = do
481549 let nextPlaceholder = maybe lastPlaceholder snd $ Map.lookupGT (Some.This k) phs
482550 forM_ (Map.lookup (Some.This k) phs) $ \thisPlaceholder -> thisPlaceholder `deleteUpTo` nextPlaceholder
@@ -485,7 +553,7 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
485553 return (result0, result')
486554 traverseDMapWithKeyWithAdjustWithMove (f :: forall a. k a -> v a -> ImmediateDomBuilderT t m (v' a)) (dm0 :: DMap k v) dm' = do
487555 initialEnv <- ImmediateDomBuilderT ask
488− (children0, children') <- lift $ traverseDMapWithKeyWithAdjustWithMove (\k v -> drawChildUpdate initialEnv $ f k v) dm0 dm'
556+ (children0, children') <- ImmediateDomBuilderT $ lift $ traverseDMapWithKeyWithAdjustWithMove (\k v -> drawChildUpdate initialEnv $ f k v) dm0 dm'
489557 let result0 = DMap.map (\(Compose (_, _, v)) -> v) children0
490558 placeholders0 = weakenDMapWith (\(Compose (_, ph, _)) -> ph) children0
491559 result' = ffor children' $ mapPatchDMapWithMove $ \(Compose (_, _, r)) -> r
@@ -493,11 +561,11 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
493561 placeholders <- current . incrementalToDynamic <$> holdIncremental placeholders0 placeholders'
494562 _ <- DMap.traverseWithKey (\_ (Compose (df, _, _)) -> Constant () <$ append df) children0
495563 lastPlaceholder <- textNodeInternal ("" :: Text)
496− performEvent_ $ flip push children' $ \p_ -> do
564+ requestDomAction_ $ flip push children' $ \p_ -> do
497565 let p = unPatchDMapWithMove p_
498566 phsBefore <- sample placeholders
499567 if DMap.null p then return Nothing else return $ Just $ do
500− let collectIfMoved :: forall a. k a -> DMapEdit k (Compose ((,,) DOM.DocumentFragment DOM.Text) v') a -> Performable m (Constant (Maybe DOM.DocumentFragment) a)
568+ let collectIfMoved :: forall a. k a -> DMapEdit k (Compose ((,,) DOM.DocumentFragment DOM.Text) v') a -> JSM (Constant (Maybe DOM.DocumentFragment) a)
501569 collectIfMoved k e = do
502570 let mThisPlaceholder = Map.lookup (Some.This k) phsBefore -- Will be Nothing if this element wasn't present before
503571 nextPlaceholder = maybe lastPlaceholder snd $ Map.lookupGT (Some.This k) phsBefore
@@ -509,7 +577,7 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
509577 Constant <$> mapM (`collectUpTo` nextPlaceholder) mThisPlaceholder
510578 collected <- DMap.traverseWithKey collectIfMoved p
511579 let phsAfter = fromMaybe phsBefore $ apply (weakenPatchDMapWithMoveWith (\(Compose (_, ph, _)) -> ph) p_) phsBefore --TODO: Don't recompute this
512− let placeFragment :: forall a. k a -> DMapEdit k (Compose ((,,) DOM.DocumentFragment DOM.Text) v') a -> Performable m (Constant () a)
580+ let placeFragment :: forall a. k a -> DMapEdit k (Compose ((,,) DOM.DocumentFragment DOM.Text) v') a -> JSM (Constant () a)
513581 placeFragment k e = do
514582 let nextPlaceholder = maybe lastPlaceholder snd $ Map.lookupGT (Some.This k) phsAfter
515583 case e of
@@ -525,10 +593,12 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, PerformEvent t m
525593 return ()
526594 return (result0, result')
527595
528−drawChildUpdate :: MonadJSM m => ImmediateDomBuilderEnv t -> ImmediateDomBuilderT t m (v' a) -> m (Compose ((,,) DOM.DocumentFragment DOM.Text) v' a)
596+drawChildUpdate :: (MonadJSM m, PerformEvent t m, MonadFix m, MonadJSM (Performable m)) => ImmediateDomBuilderEnv t m -> ImmediateDomBuilderT t m (v' a) -> RequesterT t JSM Identity m (Compose ((,,) DOM.DocumentFragment DOM.Text) v' a)
529597drawChildUpdate initialEnv child = do
530598 df <- createDocumentFragmentUnchecked $ _immediateDomBuilderEnv_document initialEnv
531− runImmediateDomBuilderT (Compose <$> ((,,) <$> pure df <*> textNodeInternal ("" :: Text) <*> child)) $ initialEnv { _immediateDomBuilderEnv_parent = toNode df }
599+ runReaderT (unImmediateDomBuilderT $ Compose <$> ((,,) <$> pure df <*> textNodeInternal ("" :: Text) <*> child)) $ initialEnv
600+ { _immediateDomBuilderEnv_parent = toNode df
601+ }
532602
533603mkHasFocus :: (MonadHold t m, Reflex t) => Element er d t -> m (Dynamic t Bool)
534604mkHasFocus e = do
@@ -538,21 +608,6 @@ mkHasFocus e = do
538608 , True <$ Reflex.select (_element_events e) (WrapArg Focus)
539609 ]
540610
541−{-# INLINABLE insertImmediateAbove #-}
542−insertImmediateAbove :: (IsNode placeholder, PerformEvent t m, MonadJSM (Performable m)) => placeholder -> Event t (ImmediateDomBuilderT t (Performable m) a) -> ImmediateDomBuilderT t m (Event t a)
543−insertImmediateAbove n toInsertAbove = do
544− events <- askEvents
545− lift $ performEvent $ ffor toInsertAbove $ \new -> do
546− doc <- getOwnerDocumentUnchecked n
547− df <- createDocumentFragmentUnchecked doc
548− result <- runImmediateDomBuilderT new $ ImmediateDomBuilderEnv
549− { _immediateDomBuilderEnv_parent = toNode df
550− , _immediateDomBuilderEnv_document = doc
551− , _immediateDomBuilderEnv_events = events
552− }
553− df `insertBefore` n
554− return result
555−
556611insertBefore :: (MonadJSM m, IsNode new, IsNode existing) => new -> existing -> m ()
557612insertBefore new existing = do
558613 p <- getParentNodeUnchecked existing