on develop help sign in
Move PostBuild to reflex.
commit00f4d85079508090f8affc7a2cca088306801e3e authorDave Laing <dave.laing.80@gmail.com> dateSun 14 Aug 2016, 15:01 (10 years ago) parentdecca15
17 files changed+60−152
reflex-dom.cabal−1 src/Foreign/JavaScript/TH.hs+9 src/Reflex/Dom.hs−1 src/Reflex/Dom/Builder/Class.hs+39−10 src/Reflex/Dom/Builder/Immediate.hs+1−1 src/Reflex/Dom/Builder/Static.hs+1−1 src/Reflex/Dom/Class.hs+1−1 src/Reflex/Dom/DynamicWriter.hs+1−1 src/Reflex/Dom/Internal.hs+1−1 src/Reflex/Dom/Old.hs+1−1 src/Reflex/Dom/PostBuild/Class.hs−128 src/Reflex/Dom/Time.hs+1−1 src/Reflex/Dom/WebSocket.hs+1−1 src/Reflex/Dom/Widget/Basic.hs+1−1 src/Reflex/Dom/Widget/Input.hs+1−1 src/Reflex/Dom/Widget/Lazy.hs+1−1 src/Reflex/Dom/Widget/Resize.hs+1−1
reflex-dom.cabal−1
@@ -84,7 +84,6 @@ library
8484 Reflex.Dom.Internal
8585 Reflex.Dom.Internal.Foreign
8686 Reflex.Dom.Location
87− Reflex.Dom.PostBuild.Class
8887 Reflex.Dom.Old
8988 Reflex.Dom.Time
9089 Reflex.Dom.WebSocket
src/Foreign/JavaScript/TH.hs+9
@@ -24,6 +24,7 @@ import Reflex.Class
2424import Reflex.Deletable.Class
2525import Reflex.PerformEvent.Base
2626import Reflex.PerformEvent.Class
27+import Reflex.PostBuild.Class
2728import Reflex.Host.Class
2829
2930import Language.Haskell.TH
@@ -99,6 +100,10 @@ instance (ReflexHost t, HasWebView (HostFrame t)) => HasWebView (PerformEventT t
99100 type WebViewPhantom (PerformEventT t m) = WebViewPhantom (HostFrame t)
100101 askWebView = PerformEventT $ lift askWebView
101102
103+instance HasWebView m => HasWebView (PostBuildT t m) where
104+ type WebViewPhantom (PostBuildT t m) = WebViewPhantom m
105+ askWebView = lift askWebView
106+
102107newtype WithWebView x m a = WithWebView { unWithWebView :: ReaderT (WebViewSingleton x) m a } deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadTrans, MonadException, MonadAsyncException)
103108
104109instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (WithWebView x m) where
@@ -200,6 +205,10 @@ instance (HasJS x (HostFrame t), ReflexHost t) => HasJS x (PerformEventT t m) wh
200205 type JSM (PerformEventT t m) = JSM (HostFrame t)
201206 liftJS = PerformEventT . lift . liftJS
202207
208+instance (HasJS x m, ReflexHost t) => HasJS x (PostBuildT t m) where
209+ type JSM (PostBuildT t m) = JSM m
210+ liftJS = lift . liftJS
211+
203212-- | A Monad that is capable of executing JavaScript
204213class Monad m => MonadJS x m | m -> x where
205214 runJS :: JSFFI -> [JSRef x] -> m (JSRef x)
src/Reflex/Dom.hs−1
@@ -9,7 +9,6 @@ import Reflex.Dom.DynamicWriter as X
99import Reflex.Dom.Internal as X
1010import Reflex.Dom.Location as X
1111import Reflex.Dom.Old as X
12−import Reflex.Dom.PostBuild.Class as X
1312import Reflex.Dom.Time as X
1413import Reflex.Dom.WebSocket as X
1514import Reflex.Dom.Widget as X
src/Reflex/Dom/Builder/Class.hs+39−10
@@ -10,6 +10,7 @@
1010{-# LANGUAGE OverloadedStrings #-}
1111{-# LANGUAGE PolyKinds #-}
1212{-# LANGUAGE RankNTypes #-}
13+{-# LANGUAGE RecursiveDo #-}
1314{-# LANGUAGE ScopedTypeVariables #-}
1415{-# LANGUAGE TemplateHaskell #-}
1516{-# LANGUAGE TypeFamilies #-}
@@ -23,6 +24,8 @@ module Reflex.Dom.Builder.Class
2324import Reflex
2425import Reflex.Dom.Builder.Class.Events
2526import Reflex.Deletable.Class
27+import Reflex.PerformEvent.Class
28+import Reflex.PostBuild.Class
2629
2730import qualified Control.Category
2831import Control.Lens hiding (element)
@@ -44,7 +47,7 @@ class Default (EventSpec d EventResult) => DomSpace d where
4447 type RawInputElement d :: *
4548 type RawTextAreaElement d :: *
4649
47−-- | @'DomBuilder' t m@ indicates that @m@ is a 'Monad' capable of building dynamic DOM in the 'Reflex' timeline @t@
50+-- | @'DomBuildek' t m@ indicates that @m@ is a 'Monad' capable of building dynamic DOM in the 'Reflex' timeline @t@
4851class (Monad m, Reflex t, Deletable t m, DomSpace (DomBuilderSpace m)) => DomBuilder t m | m -> t where
4952 type DomBuilderSpace m :: *
5053 textNode :: TextNodeConfig t -> m (TextNode (DomBuilderSpace m) t)
@@ -121,15 +124,6 @@ data ElementConfig er t m
121124 , _elementConfig_eventSpec :: EventSpec (DomBuilderSpace m) er
122125 }
123126
124−instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (ElementConfig er t m) where
125− {-# INLINABLE def #-}
126− def = ElementConfig
127− { _elementConfig_namespace = Nothing
128− , _elementConfig_initialAttributes = mempty
129− , _elementConfig_modifyAttributes = never
130− , _elementConfig_eventSpec = def
131− }
132−
133127data Element er d t
134128 = Element { _element_events :: EventSelector t (WrapArg er EventName) --TODO: EventSelector should have two arguments
135129 , _element_raw :: RawElement d
@@ -264,6 +258,41 @@ instance HasNamespace (ElementConfig er t m) where
264258 {-# INLINABLE namespace #-}
265259 namespace = elementConfig_namespace
266260
261+instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (ElementConfig er t m) where
262+ {-# INLINABLE def #-}
263+ def = ElementConfig
264+ { _elementConfig_namespace = Nothing
265+ , _elementConfig_initialAttributes = mempty
266+ , _elementConfig_modifyAttributes = never
267+ , _elementConfig_eventSpec = def
268+ }
269+
270+instance (DomBuilder t m, PerformEvent t m, MonadFix m, MonadHold t m) => DomBuilder t (PostBuildT t m) where
271+ type DomBuilderSpace (PostBuildT t m) = DomBuilderSpace m
272+ {-# INLINABLE textNode #-}
273+ textNode = lift . textNode
274+ {-# INLINABLE element #-}
275+ element t cfg child = liftWith $ \run -> element t (liftPostBuildTElementConfig cfg) $ run child
276+ {-# INLINABLE placeholder #-}
277+ placeholder cfg = lift $ do
278+ rec childPostBuild <- deletable (_placeholder_deletedSelf p) $ performEvent $ return () <$ _placeholder_insertedAbove p
279+ p <- placeholder $ cfg
280+ { _placeholderConfig_insertAbove = ffor (_placeholderConfig_insertAbove cfg) $ \a -> runPostBuildT a =<< headE childPostBuild
281+ }
282+ return p
283+ {-# INLINABLE inputElement #-}
284+ inputElement cfg = lift $ inputElement $ cfg & inputElementConfig_elementConfig %~ liftPostBuildTElementConfig
285+ {-# INLINABLE textAreaElement #-}
286+ textAreaElement cfg = lift $ textAreaElement $ cfg & textAreaElementConfig_elementConfig %~ liftPostBuildTElementConfig
287+ placeRawElement = lift . placeRawElement
288+ wrapRawElement e cfg = liftWith $ \run -> wrapRawElement e $ fmap1 run cfg
289+
290+{-# INLINABLE liftPostBuildTElementConfig #-}
291+liftPostBuildTElementConfig :: ElementConfig er t (PostBuildT t m) -> ElementConfig er t m
292+liftPostBuildTElementConfig cfg = cfg
293+ { _elementConfig_eventSpec = _elementConfig_eventSpec cfg
294+ }
295+
267296-- * Convenience functions
268297
269298--TODO: Move/replace
src/Reflex/Dom/Builder/Immediate.hs+1−1
@@ -20,7 +20,7 @@ import Foreign.JavaScript.TH
2020import Reflex
2121import Reflex.Dom.Builder.Class
2222import Reflex.PerformEvent.Class
23−import Reflex.Dom.PostBuild.Class
23+import Reflex.PostBuild.Class
2424import Reflex.Host.Class
2525
2626import Control.Concurrent.Chan
src/Reflex/Dom/Builder/Static.hs+1−1
@@ -36,7 +36,7 @@ import Reflex
3636import Reflex.Dom.Builder.Class
3737import Reflex.PerformEvent.Base
3838import Reflex.PerformEvent.Class
39−import Reflex.Dom.PostBuild.Class
39+import Reflex.PostBuild.Class
4040import Reflex.Dom.Widget.Basic (applyMap)
4141import Reflex.Host.Class
4242
src/Reflex/Dom/Class.hs+1−1
@@ -11,7 +11,7 @@ import Web.KeyCode
1111
1212import Foreign.JavaScript.TH
1313import Reflex.PerformEvent.Class
14−import Reflex.Dom.PostBuild.Class
14+import Reflex.PostBuild.Class
1515
1616import Prelude hiding (concat, mapM, mapM_, sequence)
1717
src/Reflex/Dom/DynamicWriter.hs+1−1
@@ -30,7 +30,7 @@ import Reflex
3030import Reflex.Dom.Builder.Class
3131import Reflex.Dom.Class
3232import Reflex.PerformEvent.Class
33−import Reflex.Dom.PostBuild.Class
33+import Reflex.PostBuild.Class
3434import Reflex.Host.Class
3535
3636instance MonadTrans (DynamicWriterT t w) where
src/Reflex/Dom/Internal.hs+1−1
@@ -19,7 +19,7 @@ import Reflex.Dom.Builder.Immediate
1919import Reflex.Dom.Class
2020import Reflex.Dom.Internal.Foreign
2121import Reflex.PerformEvent.Base
22−import Reflex.Dom.PostBuild.Class
22+import Reflex.PostBuild.Class
2323import Reflex.Host.Class
2424import Reflex.Spider (Global, Spider, SpiderHost, runSpiderHost)
2525
src/Reflex/Dom/Old.hs+1−1
@@ -68,7 +68,7 @@ import Reflex.Dom.Builder.Class
6868import Reflex.Dom.Builder.Immediate
6969import Reflex.Dom.Internal.Foreign
7070import Reflex.PerformEvent.Class
71−import Reflex.Dom.PostBuild.Class
71+import Reflex.PostBuild.Class
7272import Reflex.Dom.Widget.Basic
7373import Reflex.Host.Class
7474
src/Reflex/Dom/PostBuild/Class.hsdeleted−128
@@ -1,128 +0,0 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE FlexibleInstances #-}
3−{-# LANGUAGE FunctionalDependencies #-}
4−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5−{-# LANGUAGE MultiParamTypeClasses #-}
6−{-# LANGUAGE RecursiveDo #-}
7−{-# LANGUAGE ScopedTypeVariables #-}
8−{-# LANGUAGE TypeFamilies #-}
9−{-# LANGUAGE TypeOperators #-}
10−{-# LANGUAGE UndecidableInstances #-}
11−module Reflex.Dom.PostBuild.Class where
12−
13−import Control.Lens hiding (element)
14−import Control.Monad.Exception
15−import Control.Monad.Reader
16−import Control.Monad.Ref
17−import Control.Monad.Trans.Control
18−import Foreign.JavaScript.TH
19−import Reflex
20−import Reflex.Dom.Builder.Class
21−import Reflex.PerformEvent.Class
22−import Reflex.Host.Class
23−
24−class (Reflex t, Monad m) => PostBuild t m | m -> t where
25− getPostBuild :: m (Event t ())
26−
27−newtype PostBuildT t m a = PostBuildT { unPostBuildT :: ReaderT (Event t ()) m a } deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadTrans, MonadException, MonadAsyncException)
28−
29−instance MonadTransControl (PostBuildT t) where
30− type StT (PostBuildT t) a = StT (ReaderT (Event t ())) a
31− {-# INLINABLE liftWith #-}
32− liftWith = defaultLiftWith PostBuildT unPostBuildT
33− {-# INLINABLE restoreT #-}
34− restoreT = defaultRestoreT PostBuildT
35−
36−instance (Reflex t, Monad m) => PostBuild t (PostBuildT t m) where
37− {-# INLINABLE getPostBuild #-}
38− getPostBuild = PostBuildT ask
39−
40−instance Deletable t m => Deletable t (PostBuildT t m) where
41− {-# INLINABLE deletable #-}
42− deletable = liftThrough . deletable
43−
44−{-# INLINABLE liftPostBuildTElementConfig #-}
45−liftPostBuildTElementConfig :: ElementConfig er t (PostBuildT t m) -> ElementConfig er t m
46−liftPostBuildTElementConfig cfg = cfg
47− { _elementConfig_eventSpec = _elementConfig_eventSpec cfg
48− }
49−
50−instance (DomBuilder t m, PerformEvent t m, MonadFix m, MonadHold t m) => DomBuilder t (PostBuildT t m) where
51− type DomBuilderSpace (PostBuildT t m) = DomBuilderSpace m
52− {-# INLINABLE textNode #-}
53− textNode = lift . textNode
54− {-# INLINABLE element #-}
55− element t cfg child = liftWith $ \run -> element t (liftPostBuildTElementConfig cfg) $ run child
56− {-# INLINABLE placeholder #-}
57− placeholder cfg = lift $ do
58− rec childPostBuild <- deletable (_placeholder_deletedSelf p) $ performEvent $ return () <$ _placeholder_insertedAbove p
59− p <- placeholder $ cfg
60− { _placeholderConfig_insertAbove = ffor (_placeholderConfig_insertAbove cfg) $ \a -> runPostBuildT a =<< headE childPostBuild
61− }
62− return p
63− {-# INLINABLE inputElement #-}
64− inputElement cfg = lift $ inputElement $ cfg & inputElementConfig_elementConfig %~ liftPostBuildTElementConfig
65− {-# INLINABLE textAreaElement #-}
66− textAreaElement cfg = lift $ textAreaElement $ cfg & textAreaElementConfig_elementConfig %~ liftPostBuildTElementConfig
67− placeRawElement = lift . placeRawElement
68− wrapRawElement e cfg = liftWith $ \run -> wrapRawElement e $ fmap1 run cfg
69−
70−instance MonadSample t m => MonadSample t (PostBuildT t m) where
71− {-# INLINABLE sample #-}
72− sample = lift . sample
73−
74−instance MonadHold t m => MonadHold t (PostBuildT t m) where
75− {-# INLINABLE hold #-}
76− hold v0 = lift . hold v0
77− {-# INLINABLE holdDyn #-}
78− holdDyn v0 = lift . holdDyn v0
79− {-# INLINABLE holdIncremental #-}
80− holdIncremental v0 = lift . holdIncremental v0
81−
82−instance PerformEvent t m => PerformEvent t (PostBuildT t m) where
83− type Performable (PostBuildT t m) = PostBuildT t (Performable m)
84− {-# INLINABLE performEvent_ #-}
85− performEvent_ e = liftWith $ \run -> performEvent_ $ fmap run e
86− {-# INLINABLE performEvent #-}
87− performEvent e = liftWith $ \run -> performEvent $ fmap run e
88−
89−instance (ReflexHost t, MonadReflexCreateTrigger t m) => MonadReflexCreateTrigger t (PostBuildT t m) where
90− {-# INLINABLE newEventWithTrigger #-}
91− newEventWithTrigger = PostBuildT . lift . newEventWithTrigger
92− {-# INLINABLE newFanEventWithTrigger #-}
93− newFanEventWithTrigger f = PostBuildT $ lift $ newFanEventWithTrigger f
94−
95−instance TriggerEvent t m => TriggerEvent t (PostBuildT t m) where
96− {-# INLINABLE newTriggerEvent #-}
97− newTriggerEvent = lift newTriggerEvent
98− {-# INLINABLE newTriggerEventWithOnComplete #-}
99− newTriggerEventWithOnComplete = lift newTriggerEventWithOnComplete
100− newEventWithLazyTriggerWithOnComplete = lift . newEventWithLazyTriggerWithOnComplete
101−
102−instance MonadRef m => MonadRef (PostBuildT t m) where
103− type Ref (PostBuildT t m) = Ref m
104− {-# INLINABLE newRef #-}
105− newRef = lift . newRef
106− {-# INLINABLE readRef #-}
107− readRef = lift . readRef
108− {-# INLINABLE writeRef #-}
109− writeRef r = lift . writeRef r
110−
111−instance MonadAtomicRef m => MonadAtomicRef (PostBuildT t m) where
112− {-# INLINABLE atomicModifyRef #-}
113− atomicModifyRef r = lift . atomicModifyRef r
114−
115−instance (HasJS x m, ReflexHost t) => HasJS x (PostBuildT t m) where
116− type JSM (PostBuildT t m) = JSM m
117− liftJS = lift . liftJS
118−
119−instance HasWebView m => HasWebView (PostBuildT t m) where
120− type WebViewPhantom (PostBuildT t m) = WebViewPhantom m
121− askWebView = lift askWebView
122−
123−{-# INLINABLE runPostBuildT #-}
124−runPostBuildT :: PostBuildT t m a -> Event t () -> m a
125−runPostBuildT (PostBuildT a) = runReaderT a
126−
127−instance PostBuild t m => PostBuild t (ReaderT r m) where
128− getPostBuild = lift getPostBuild
src/Reflex/Dom/Time.hs+1−1
@@ -8,7 +8,7 @@ module Reflex.Dom.Time where
88
99import Reflex
1010import Reflex.PerformEvent.Class
11−import Reflex.Dom.PostBuild.Class
11+import Reflex.PostBuild.Class
1212
1313import Control.Concurrent
1414import qualified Control.Concurrent.Thread.Delay as Concurrent
src/Reflex/Dom/WebSocket.hs+1−1
@@ -26,7 +26,7 @@ import Prelude hiding (all, concat, concatMap, div, mapM, mapM_, sequence, span)
2626import Reflex
2727import Reflex.Dom.Class
2828import Reflex.PerformEvent.Class
29−import Reflex.Dom.PostBuild.Class
29+import Reflex.PostBuild.Class
3030import Reflex.Dom.WebSocket.Foreign
3131
3232import Control.Concurrent
src/Reflex/Dom/Widget/Basic.hs+1−1
@@ -15,7 +15,7 @@ module Reflex.Dom.Widget.Basic where
1515import Reflex.Dom.Builder.Class
1616import Reflex.Dom.Class
1717import Reflex.Dom.Internal.Foreign ()
18−import Reflex.Dom.PostBuild.Class
18+import Reflex.PostBuild.Class
1919
2020import Control.Arrow
2121import Control.Lens hiding (children, element)
src/Reflex/Dom/Widget/Input.hs+1−1
@@ -44,7 +44,7 @@ import Reflex.Dom.Builder.Class
4444import Reflex.Dom.Builder.Immediate
4545import Reflex.Dom.Class
4646import Reflex.PerformEvent.Class
47−import Reflex.Dom.PostBuild.Class
47+import Reflex.PostBuild.Class
4848import Reflex.Dom.Widget.Basic
4949import qualified Text.Read as T
5050
src/Reflex/Dom/Widget/Lazy.hs+1−1
@@ -11,7 +11,7 @@ import Reflex.Dom.Builder.Class
1111import Reflex.Dom.Builder.Immediate
1212import Reflex.Dom.Class
1313import Reflex.PerformEvent.Class
14−import Reflex.Dom.PostBuild.Class
14+import Reflex.PostBuild.Class
1515import Reflex.Dom.Widget.Basic
1616
1717import Control.Monad.Fix
src/Reflex/Dom/Widget/Resize.hs+1−1
@@ -10,7 +10,7 @@ import Reflex.Dom.Builder.Class
1010import Reflex.Dom.Builder.Immediate
1111import Reflex.Dom.Class
1212import Reflex.PerformEvent.Class
13−import Reflex.Dom.PostBuild.Class
13+import Reflex.PostBuild.Class
1414import Reflex.Dom.Widget.Basic
1515
1616import Control.Monad