on develop help sign in
Improve specialization

* Add Reflex.Dom.Specializations * Get rid of some unused arguments that were blocking specialization via worker/wrapper transform

commit64e750fa17f83e7476b054f91b4446ff2ad7f913 authorRyan Trinkle <ryan.trinkle@gmail.com> dateSat 5 Aug 2017, 10:44 (9 years ago) parent3193118
5 files changed+80−11
reflex-dom-core/reflex-dom-core.cabal+1 reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs+10−10 reflex-dom-core/src/Reflex/Dom/Main.hs+3−1 reflex-dom-core/src/Reflex/Dom/Specializations.hs+65 reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs+1
reflex-dom-core/reflex-dom-core.cabal+1
@@ -98,6 +98,7 @@ library
9898 Reflex.Dom.Modals.Class
9999 Reflex.Dom.Old
100100 Reflex.Dom.Prerender
101+ Reflex.Dom.Specializations
101102 Reflex.Dom.Time
102103 Reflex.Dom.WebSocket
103104 Reflex.Dom.Widget
reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs+10−10
@@ -196,7 +196,7 @@ instance PrimMonad m => PrimMonad (ImmediateDomBuilderT x m) where
196196instance MonadTrans (ImmediateDomBuilderT t) where
197197 lift = ImmediateDomBuilderT . lift . lift . lift
198198
199−instance (Reflex t, MonadFix m, PrimMonad m) => DomRenderHook t (ImmediateDomBuilderT t m) where
199+instance (Reflex t, MonadFix m) => DomRenderHook t (ImmediateDomBuilderT t m) where
200200 withRenderHook hook (ImmediateDomBuilderT a) = do
201201 e <- ImmediateDomBuilderT ask
202202 ImmediateDomBuilderT $ lift $ withRequesting $ \rsp -> do
@@ -271,7 +271,7 @@ localEnv :: Monad m => (ImmediateDomBuilderEnv t -> ImmediateDomBuilderEnv t) ->
271271localEnv f = ImmediateDomBuilderT . local f . unImmediateDomBuilderT
272272
273273{-# INLINABLE append #-}
274−append :: (IsNode n, MonadJSM m) => n -> ImmediateDomBuilderT t m ()
274+append :: MonadJSM m => DOM.Node -> ImmediateDomBuilderT t m ()
275275append n = do
276276 p <- askParent
277277 liftJSM $ appendChild_ p n
@@ -282,7 +282,7 @@ textNodeInternal :: (MonadJSM m, ToDOMString contents) => contents -> ImmediateD
282282textNodeInternal !t = do
283283 doc <- askDocument
284284 n <- liftJSM $ createTextNode doc t
285− append n
285+ append $ toNode n
286286 return n
287287
288288-- | s and e must both be children of the same node and s must precede e;
@@ -352,7 +352,7 @@ collectUpToGivenParent currentParent s e = do
352352newtype EventFilterTriggerRef t er (en :: EventTag) = EventFilterTriggerRef (IORef (Maybe (EventTrigger t (er en))))
353353
354354{-# INLINABLE wrap #-}
355−wrap :: forall m er t. SupportsImmediateDomBuilder t m => RawElement GhcjsDomSpace -> RawElementConfig er t GhcjsDomSpace -> ImmediateDomBuilderT t m (Element er GhcjsDomSpace t)
355+wrap :: forall m er t. (Reflex t, MonadFix m, MonadJSM m, MonadReflexCreateTrigger t m) => RawElement GhcjsDomSpace -> RawElementConfig er t GhcjsDomSpace -> ImmediateDomBuilderT t m (Element er GhcjsDomSpace t)
356356wrap e cfg = do
357357 events <- askEvents
358358 forM_ (_rawElementConfig_modifyAttributes cfg) $ \modifyAttrs -> requestDomAction_ $ ffor modifyAttrs $ imapM_ $ \(AttributeName mAttrNamespace n) mv -> case mAttrNamespace of
@@ -396,7 +396,7 @@ wrap e cfg = do
396396 }
397397
398398{-# INLINABLE makeElement #-}
399−makeElement :: forall er t m a. (Reflex t, MonadJSM m, MonadHold t m, MonadFix m, MonadReflexCreateTrigger t m, MonadRef m, Ref m ~ Ref JSM, MonadAdjust t m, PrimMonad m) => Text -> ElementConfig er t GhcjsDomSpace -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.Element)
399+makeElement :: forall er t m a. (MonadJSM m, MonadFix m, MonadReflexCreateTrigger t m, MonadAdjust t m) => Text -> ElementConfig er t GhcjsDomSpace -> ImmediateDomBuilderT t m a -> ImmediateDomBuilderT t m ((Element er GhcjsDomSpace t, a), DOM.Element)
400400makeElement elementTag cfg child = do
401401 doc <- askDocument
402402 e <- liftJSM $ uncheckedCastTo DOM.Element <$> case cfg ^. namespace of
@@ -408,7 +408,7 @@ makeElement elementTag cfg child = do
408408 result <- flip localEnv child $ \env -> env
409409 { _immediateDomBuilderEnv_parent = toNode e
410410 }
411− append e
411+ append $ toNode e
412412 wrapped <- wrap e $ extractRawElementConfig cfg
413413 return ((wrapped, result), e)
414414
@@ -589,7 +589,7 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
589589 , _selectElement_raw = domSelectElement
590590 }
591591 return (wrapped, result)
592− placeRawElement = append
592+ placeRawElement = append . toNode
593593 wrapRawElement = wrap
594594 notReadyUntil e = do
595595 eOnce <- headE e
@@ -672,7 +672,7 @@ instance (Reflex t, MonadAdjust t m, MonadJSM m, MonadHold t m, MonadFix m, Prim
672672 unreadyChildren <- liftIO $ newIORef 0
673673 let f = do
674674 result <- a0
675− append after
675+ append $ toNode after
676676 return result
677677 result <- runReaderT (unImmediateDomBuilderT f) $ initialEnv
678678 { _immediateDomBuilderEnv_unreadyChildren = unreadyChildren
@@ -903,7 +903,7 @@ hoistTraverseIntMapWithKeyWithAdjust base updateChildUnreadiness applyDomUpdate_
903903 placeholders0 = fmap (\(_, ph, _, _) -> ph) children0
904904 result' = ffor children' $ fmap $ \(_, _, _, r) -> r
905905 liftIO $ writeIORef placeholders $! placeholders0
906− _ <- IntMap.traverseWithKey (\_ (df, _, _, _) -> void $ append df) children0
906+ _ <- IntMap.traverseWithKey (\_ (df, _, _, _) -> void $ append $ toNode df) children0
907907 liftIO . writeIORef lastPlaceholderRef =<< textNodeInternal ("" :: Text)
908908 requestDomAction_ $ ffor children' $ \p -> do
909909 (oldUnready, oldP) <- liftIO $ readIORef pendingChange
@@ -993,7 +993,7 @@ hoistTraverseWithKeyWithAdjust base mapPatch updateChildUnreadiness applyDomUpda
993993 placeholders0 = weakenDMapWith (\(Compose (_, ph, _, _)) -> ph) children0
994994 result' = ffor children' $ mapPatch $ \(Compose (_, _, _, r)) -> r
995995 liftIO $ writeIORef placeholders $! placeholders0
996− _ <- DMap.traverseWithKey (\_ (Compose (df, _, _, _)) -> Constant () <$ append df) children0
996+ _ <- DMap.traverseWithKey (\_ (Compose (df, _, _, _)) -> Constant () <$ append (toNode df)) children0
997997 liftIO . writeIORef lastPlaceholderRef =<< textNodeInternal ("" :: Text)
998998 requestDomAction_ $ ffor children' $ \p -> do
999999 (oldUnready, oldP) <- liftIO $ readIORef pendingChange
reflex-dom-core/src/Reflex/Dom/Main.hs+3−1
@@ -23,6 +23,8 @@ import Reflex.PostBuild.Base
2323import Reflex.Spider (Global, Spider, SpiderHost, runSpiderHost)
2424import Reflex.TriggerEvent.Base
2525
26+import Reflex.Dom.Specializations () -- For SPECIALIZATION pragmas, which are always re-exported
27+
2628import Control.Concurrent
2729import Control.Lens
2830import Control.Monad
@@ -59,7 +61,7 @@ mainWidget' w = withJSContextSingletonMono $ \jsSing -> do
5961--TODO: The x's should be unified here
6062{-# INLINABLE mainWidgetWithHead #-}
6163mainWidgetWithHead :: (forall x. Widget x ()) -> (forall x. Widget x ()) -> JSM ()
62−mainWidgetWithHead h b = withJSContextSingleton $ \jsSing -> do
64+mainWidgetWithHead h b = withJSContextSingletonMono $ \jsSing -> do
6365 doc <- currentDocumentUnchecked
6466 headElement <- getHeadUnchecked doc
6567 attachWidget headElement jsSing h
reflex-dom-core/src/Reflex/Dom/Specializations.hsnew file+65
@@ -0,0 +1,65 @@
1+{-# LANGUAGE RecursiveDo #-}
2+{-# LANGUAGE GADTs #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE ScopedTypeVariables #-}
5+{-# LANGUAGE RecordWildCards #-}
6+{-# LANGUAGE FlexibleContexts #-}
7+{-# LANGUAGE Rank2Types #-}
8+module Reflex.Dom.Specializations where
9+
10+import Data.Text (Text)
11+import Reflex.Spider
12+import Reflex.Class
13+import Foreign.JavaScript.TH
14+import Reflex.PerformEvent.Base
15+import Reflex.PostBuild.Base
16+import Reflex.Requester.Base
17+import Reflex.TriggerEvent.Base
18+import Reflex.Dom.Builder.Class
19+import Reflex.Dom.Builder.Immediate
20+import Data.Functor.Identity
21+import Data.Functor.Compose
22+import Data.IORef
23+import GHCJS.DOM.Types (JSM)
24+import Data.IntMap.Strict (IntMap)
25+import qualified Data.IntMap.Strict as IntMap
26+import Data.FastMutableIntMap
27+
28+import qualified GHCJS.DOM.Element as DOM
29+import qualified GHCJS.DOM.Types as DOM
30+
31+{-# SPECIALIZE makeElement :: forall er a. Text -> ElementConfig er (SpiderTimeline Global) GhcjsDomSpace -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) a -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) ((Element er GhcjsDomSpace (SpiderTimeline Global), a), DOM.Element) #-}
32+
33+{-# SPECIALIZE wrap :: forall er. RawElement GhcjsDomSpace -> RawElementConfig er (SpiderTimeline Global) GhcjsDomSpace -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) (Element er GhcjsDomSpace (SpiderTimeline Global)) #-}
34+
35+{-# SPECIALIZE mapIntMapWithAdjustImpl :: forall v v'.
36+ ( (IntMap.Key -> ((Bool, Event (SpiderTimeline Global) ()), v) -> (ImmediateDomBuilderT Spider (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) v')
37+ -> IntMap ((Bool, Event (SpiderTimeline Global) ()), v)
38+ -> Event (SpiderTimeline Global) (PatchIntMap ((Bool, Event (SpiderTimeline Global) ()), v))
39+ -> (ImmediateDomBuilderT Spider (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) (IntMap v', Event (SpiderTimeline Global) (PatchIntMap v'))
40+ )
41+ -> (IntMap.Key -> v -> PostBuildT (SpiderTimeline Global) (ImmediateDomBuilderT Spider (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) v')
42+ -> IntMap v
43+ -> Event (SpiderTimeline Global) (PatchIntMap v)
44+ -> PostBuildT (SpiderTimeline Global) (ImmediateDomBuilderT Spider (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) (IntMap v', Event (SpiderTimeline Global) (PatchIntMap v'))
45+ #-}
46+
47+{-# SPECIALIZE append :: DOM.Node -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) () #-}
48+
49+{-# SPECIALIZE drawChildUpdate :: forall k v' a. ImmediateDomBuilderEnv (SpiderTimeline Global) -> (IORef (ChildReadyState k) -> JSM ()) -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) (v' a) -> RequesterT (SpiderTimeline Global) JSM Identity (TriggerEventT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) (Compose ((,,,) DOM.DocumentFragment DOM.Text (IORef (ChildReadyState k))) v' a) #-}
50+
51+{-# SPECIALIZE traverseIntMapWithKeyWithAdjust' :: forall v v'. (IntMap.Key -> v -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) v') -> IntMap v -> Event (SpiderTimeline Global) (PatchIntMap v) -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) (IntMap v', Event (SpiderTimeline Global) (PatchIntMap v')) #-}
52+
53+{-# SPECIALIZE hoistTraverseIntMapWithKeyWithAdjust :: forall v v'.
54+ ( (IntMap.Key -> v -> RequesterT (SpiderTimeline Global) JSM Identity (TriggerEventT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'))
55+ -> IntMap v
56+ -> Event (SpiderTimeline Global) (PatchIntMap v)
57+ -> RequesterT (SpiderTimeline Global) JSM Identity (TriggerEventT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global)))) (IntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'), Event (SpiderTimeline Global) (PatchIntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')))
58+ )
59+ -> (PatchIntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v') -> IntMap (IORef ChildReadyStateInt) -> IO (IntMap (IORef ChildReadyStateInt)))
60+ -> (IORef (IntMap DOM.Text) -> IORef DOM.Text -> PatchIntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v') -> JSM ())
61+ -> (IntMap.Key -> v -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) v')
62+ -> IntMap v
63+ -> Event (SpiderTimeline Global) (PatchIntMap v)
64+ -> ImmediateDomBuilderT (SpiderTimeline Global) (WithJSContextSingleton () (PerformEventT Spider (SpiderHost Global))) (IntMap v', Event (SpiderTimeline Global) (PatchIntMap v'))
65+ #-}
reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs+1
@@ -138,6 +138,7 @@ listHoldWithKey m0 m' f = do
138138text :: DomBuilder t m => Text -> m ()
139139text t = void $ textNode $ def & textNodeConfig_initialContents .~ t
140140
141+{- INLINABLE dynText #-}
141142dynText :: forall t m. (PostBuild t m, DomBuilder t m) => Dynamic t Text -> m ()
142143dynText t = do
143144 postBuild <- getPostBuild