@@ -51,7 +51,6 @@ import Data.Semigroup
5151import Data.String
5252import Data.Text (Text)
5353import Data.Type.Coercion
54−import GHC.Exts (Constraint)
5554import GHCJS.DOM.Types (JSM)
5655
5756class Default (EventSpec d EventResult) => DomSpace d where
@@ -64,12 +63,6 @@ class Default (EventSpec d EventResult) => DomSpace d where
6463 type RawSelectElement d :: *
6564 addEventSpecFlags :: proxy d -> EventName en -> (Maybe (er en) -> EventFlags) -> EventSpec d er -> EventSpec d er
6665
67−{-# INLINABLE liftElementConfig #-}
68−liftElementConfig :: (DomBuilderSpace (f m) ~ DomBuilderSpace m) => ElementConfig er t (f m) -> ElementConfig er t m
69−liftElementConfig cfg = cfg
70− { _elementConfig_eventSpec = _elementConfig_eventSpec cfg
71− }
72−
7366-- | @'DomBuilder' t m@ indicates that @m@ is a 'Monad' capable of building
7467-- dynamic DOM in the 'Reflex' timeline @t@
7568class (Monad m, Reflex t, DomSpace (DomBuilderSpace m), MonadAdjust t m) => DomBuilder t m | m -> t where
@@ -83,51 +76,44 @@ class (Monad m, Reflex t, DomSpace (DomBuilderSpace m), MonadAdjust t m) => DomB
8376 => TextNodeConfig t -> m (TextNode (DomBuilderSpace m) t)
8477 textNode = lift . textNode
8578 {-# INLINABLE textNode #-}
86− element :: Text -> ElementConfig er t m -> m a -> m (Element er (DomBuilderSpace m) t, a)
79+ element :: Text -> ElementConfig er t (DomBuilderSpace m) -> m a -> m (Element er (DomBuilderSpace m) t, a)
8780 default element :: ( MonadTransControl f
8881 , StT f a ~ a
8982 , m ~ f m'
9083 , DomBuilderSpace m' ~ DomBuilderSpace m
9184 , DomBuilder t m'
9285 )
93− => Text -> ElementConfig er t m -> m a -> m (Element er (DomBuilderSpace m) t, a)
94− element t cfg child = liftWith $ \run -> element t (liftElementConfig cfg) $ run child
86+ => Text -> ElementConfig er t (DomBuilderSpace m) -> m a -> m (Element er (DomBuilderSpace m) t, a)
87+ element t cfg child = liftWith $ \run -> element t cfg $ run child
9588 {-# INLINABLE element #-}
96− inputElement :: InputElementConfig er t m -> m (InputElement er (DomBuilderSpace m) t)
89+ inputElement :: InputElementConfig er t (DomBuilderSpace m) -> m (InputElement er (DomBuilderSpace m) t)
9790 default inputElement :: ( MonadTransControl f
9891 , m ~ f m'
9992 , DomBuilderSpace m' ~ DomBuilderSpace m
10093 , DomBuilder t m'
10194 )
102− => InputElementConfig er t m -> m (InputElement er (DomBuilderSpace m) t)
103− inputElement cfg = lift $ inputElement $ cfg
104− { _inputElementConfig_elementConfig = liftElementConfig $ _inputElementConfig_elementConfig cfg
105− }
95+ => InputElementConfig er t (DomBuilderSpace m) -> m (InputElement er (DomBuilderSpace m) t)
96+ inputElement = lift . inputElement
10697 {-# INLINABLE inputElement #-}
107− textAreaElement :: TextAreaElementConfig er t m -> m (TextAreaElement er (DomBuilderSpace m) t)
98+ textAreaElement :: TextAreaElementConfig er t (DomBuilderSpace m) -> m (TextAreaElement er (DomBuilderSpace m) t)
10899 default textAreaElement :: ( MonadTransControl f
109100 , m ~ f m'
110101 , DomBuilderSpace m' ~ DomBuilderSpace m
111102 , DomBuilder t m'
112103 )
113− => TextAreaElementConfig er t m -> m (TextAreaElement er (DomBuilderSpace m) t)
114− textAreaElement cfg = lift $ textAreaElement $ cfg
115− { _textAreaElementConfig_elementConfig = liftElementConfig $ _textAreaElementConfig_elementConfig cfg
116− }
104+ => TextAreaElementConfig er t (DomBuilderSpace m) -> m (TextAreaElement er (DomBuilderSpace m) t)
105+ textAreaElement = lift . textAreaElement
117106 {-# INLINABLE textAreaElement #-}
118− selectElement :: SelectElementConfig er t m -> m a -> m (SelectElement er (DomBuilderSpace m) t, a)
107+ selectElement :: SelectElementConfig er t (DomBuilderSpace m) -> m a -> m (SelectElement er (DomBuilderSpace m) t, a)
119108 default selectElement :: ( MonadTransControl f
120109 , StT f a ~ a
121110 , m ~ f m'
122111 , DomBuilderSpace m' ~ DomBuilderSpace m
123112 , DomBuilder t m'
124113 )
125− => SelectElementConfig er t m -> m a -> m (SelectElement er (DomBuilderSpace m) t, a)
114+ => SelectElementConfig er t (DomBuilderSpace m) -> m a -> m (SelectElement er (DomBuilderSpace m) t, a)
126115 selectElement cfg child = do
127− let cfg' = cfg
128− { _selectElementConfig_elementConfig = liftElementConfig $ _selectElementConfig_elementConfig cfg
129− }
130− liftWith $ \run -> selectElement cfg' $ run child
116+ liftWith $ \run -> selectElement cfg $ run child
131117 {-# INLINABLE selectElement #-}
132118 placeRawElement :: RawElement (DomBuilderSpace m) -> m ()
133119 default placeRawElement :: ( MonadTrans f
@@ -138,13 +124,13 @@ class (Monad m, Reflex t, DomSpace (DomBuilderSpace m), MonadAdjust t m) => DomB
138124 => RawElement (DomBuilderSpace m) -> m ()
139125 placeRawElement = lift . placeRawElement
140126 {-# INLINABLE placeRawElement #-}
141− wrapRawElement :: RawElement (DomBuilderSpace m) -> RawElementConfig er t m -> m (Element er (DomBuilderSpace m) t)
127+ wrapRawElement :: RawElement (DomBuilderSpace m) -> RawElementConfig er t (DomBuilderSpace m) -> m (Element er (DomBuilderSpace m) t)
142128 default wrapRawElement :: ( MonadTrans f
143129 , m ~ f m'
144130 , DomBuilderSpace m' ~ DomBuilderSpace m
145131 , DomBuilder t m'
146132 )
147− => RawElement (DomBuilderSpace m) -> RawElementConfig er t m -> m (Element er (DomBuilderSpace m) t)
133+ => RawElement (DomBuilderSpace m) -> RawElementConfig er t (DomBuilderSpace m) -> m (Element er (DomBuilderSpace m) t)
148134 wrapRawElement e cfg = lift $ wrapRawElement e $ cfg
149135 { _rawElementConfig_eventSpec = _rawElementConfig_eventSpec cfg
150136 }
@@ -239,25 +225,25 @@ preventDefault = mempty { _eventFlags_preventDefault = True }
239225stopPropagation :: EventFlags
240226stopPropagation = mempty { _eventFlags_propagation = Propagation_Stop }
241227
242−data ElementConfig er t m
228+data ElementConfig er t s
243229 = ElementConfig { _elementConfig_namespace :: Maybe Namespace
244230 , _elementConfig_initialAttributes :: Map AttributeName Text
245231 , _elementConfig_modifyAttributes :: Maybe (Event t (Map AttributeName (Maybe Text)))
246− , _elementConfig_eventSpec :: EventSpec (DomBuilderSpace m) er
232+ , _elementConfig_eventSpec :: EventSpec s er
247233 }
248234
249235#ifndef USE_TEMPLATE_HASKELL
250−elementConfig_namespace :: Lens' (ElementConfig er t m) (Maybe Namespace)
236+elementConfig_namespace :: Lens' (ElementConfig er t s) (Maybe Namespace)
251237elementConfig_namespace f (ElementConfig a b c d) = (\a' -> ElementConfig a' b c d) <$> f a
252238{-# INLINE elementConfig_namespace #-}
253−elementConfig_initialAttributes :: Lens' (ElementConfig er t m) (Map AttributeName Text)
239+elementConfig_initialAttributes :: Lens' (ElementConfig er t s) (Map AttributeName Text)
254240elementConfig_initialAttributes f (ElementConfig a b c d) = (\b' -> ElementConfig a b' c d) <$> f b
255241{-# INLINE elementConfig_initialAttributes #-}
256242elementConfig_eventSpec :: Lens
257− (ElementConfig er1 t m1)
258− (ElementConfig er2 t m2)
259− (EventSpec (DomBuilderSpace m1) er1)
260− (EventSpec (DomBuilderSpace m2) er2)
243+ (ElementConfig er1 t s1)
244+ (ElementConfig er2 t s2)
245+ (EventSpec s1 er1)
246+ (EventSpec s2 er2)
261247elementConfig_eventSpec f (ElementConfig a b c d) = (\d' -> ElementConfig a b c d') <$> f d
262248{-# INLINE elementConfig_eventSpec #-}
263249#endif
@@ -267,12 +253,12 @@ data Element er d t
267253 , _element_raw :: RawElement d
268254 }
269255
270−data InputElementConfig er t m
256+data InputElementConfig er t s
271257 = InputElementConfig { _inputElementConfig_initialValue :: Text
272258 , _inputElementConfig_setValue :: Maybe (Event t Text)
273259 , _inputElementConfig_initialChecked :: Bool
274260 , _inputElementConfig_setChecked :: Maybe (Event t Bool)
275− , _inputElementConfig_elementConfig :: ElementConfig er t m
261+ , _inputElementConfig_elementConfig :: ElementConfig er t s
276262 }
277263
278264#ifndef USE_TEMPLATE_HASKELL
@@ -291,7 +277,7 @@ inputElementConfig_elementConfig f (InputElementConfig a b c d e) = (\e' -> Inpu
291277{-# INLINE inputElementConfig_elementConfig #-}
292278#endif
293279
294−instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (InputElementConfig er t m) where
280+instance (Reflex t, er ~ EventResult, DomSpace s) => Default (InputElementConfig er t s) where
295281 {-# INLINABLE def #-}
296282 def = InputElementConfig
297283 { _inputElementConfig_initialValue = ""
@@ -331,7 +317,7 @@ textAreaElementConfig_elementConfig f (TextAreaElementConfig a b c) = (\c' -> Te
331317{-# INLINE textAreaElementConfig_elementConfig #-}
332318#endif
333319
334−instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (TextAreaElementConfig er t m) where
320+instance (Reflex t, er ~ EventResult, DomSpace s) => Default (TextAreaElementConfig er t s) where
335321 {-# INLINABLE def #-}
336322 def = TextAreaElementConfig
337323 { _textAreaElementConfig_initialValue = ""
@@ -353,9 +339,9 @@ extractRawElementConfig cfg = RawElementConfig
353339 , _rawElementConfig_eventSpec = _elementConfig_eventSpec cfg
354340 }
355341
356−data RawElementConfig er t m = RawElementConfig
342+data RawElementConfig er t s = RawElementConfig
357343 { _rawElementConfig_modifyAttributes :: Maybe (Event t (Map AttributeName (Maybe Text)))
358− , _rawElementConfig_eventSpec :: EventSpec (DomBuilderSpace m) er
344+ , _rawElementConfig_eventSpec :: EventSpec s er
359345 }
360346
361347#ifndef USE_TEMPLATE_HASKELL
@@ -368,7 +354,7 @@ rawElementConfig_eventSpec f (RawElementConfig a b) = (\b' -> RawElementConfig a
368354{-# INLINE rawElementConfig_eventSpec #-}
369355#endif
370356
371−instance (Reflex t, DomSpace (DomBuilderSpace m)) => Default (RawElementConfig EventResult t m) where
357+instance (Reflex t, DomSpace s) => Default (RawElementConfig EventResult t s) where
372358 def = RawElementConfig
373359 { _rawElementConfig_modifyAttributes = Nothing
374360 , _rawElementConfig_eventSpec = def
@@ -393,7 +379,7 @@ selectElementConfig_elementConfig f (SelectElementConfig a b c) = (\c' -> Select
393379{-# INLINE selectElementConfig_elementConfig #-}
394380#endif
395381
396−instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (SelectElementConfig er t m) where
382+instance (Reflex t, er ~ EventResult, DomSpace s) => Default (SelectElementConfig er t s) where
397383 def = SelectElementConfig
398384 { _selectElementConfig_initialValue = ""
399385 , _selectElementConfig_setValue = Nothing
@@ -518,7 +504,7 @@ instance HasNamespace (ElementConfig er t m) where
518504 {-# INLINABLE namespace #-}
519505 namespace = elementConfig_namespace
520506
521−instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (ElementConfig er t m) where
507+instance (Reflex t, er ~ EventResult, DomSpace s) => Default (ElementConfig er t s) where
522508 {-# INLINABLE def #-}
523509 def = ElementConfig
524510 { _elementConfig_namespace = Nothing
@@ -529,7 +515,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (ElementConfig
529515
530516instance (DomBuilder t m, PerformEvent t m, MonadFix m, MonadHold t m) => DomBuilder t (PostBuildT t m) where
531517 type DomBuilderSpace (PostBuildT t m) = DomBuilderSpace m
532− wrapRawElement e cfg = liftWith $ \run -> wrapRawElement e $ fmap1 run cfg
518+ wrapRawElement e = lift . wrapRawElement e
533519
534520instance (MountableDomBuilder t m, PerformEvent t m, MonadFix m, MonadHold t m) => MountableDomBuilder t (PostBuildT t m) where
535521 type DomFragment (PostBuildT t m) = DomFragment m
@@ -541,99 +527,55 @@ instance (DomBuilder t m, Monoid w, MonadHold t m, MonadFix m) => DomBuilder t (
541527 textNode = liftTextNode
542528 element elementTag cfg (DynamicWriterT child) = DynamicWriterT $ do
543529 s <- get
544− let cfg' = liftElementConfig cfg
545− (el, (a, newS)) <- lift $ element elementTag cfg' $ runStateT child s
530+ (el, (a, newS)) <- lift $ element elementTag cfg $ runStateT child s
546531 put newS
547532 return (el, a)
548− inputElement cfg = lift $ inputElement $ cfg & inputElementConfig_elementConfig %~ liftElementConfig
549− textAreaElement cfg = lift $ textAreaElement $ cfg & textAreaElementConfig_elementConfig %~ liftElementConfig
533+ inputElement = lift . inputElement
534+ textAreaElement = lift . textAreaElement
550535 selectElement cfg (DynamicWriterT child) = DynamicWriterT $ do
551536 s <- get
552− let cfg' = cfg & selectElementConfig_elementConfig %~ liftElementConfig
553− (el, (a, newS)) <- lift $ selectElement cfg' $ runStateT child s
537+ (el, (a, newS)) <- lift $ selectElement cfg $ runStateT child s
554538 put newS
555539 return (el, a)
556540 placeRawElement = lift . placeRawElement
557− wrapRawElement e cfg = lift $ wrapRawElement e $ cfg
558− { _rawElementConfig_eventSpec = _rawElementConfig_eventSpec cfg
559− }
541+ wrapRawElement e = lift . wrapRawElement e
560542
561543instance (DomBuilder t m, MonadHold t m, MonadFix m) => DomBuilder t (RequesterT t request response m) where
562544 type DomBuilderSpace (RequesterT t request response m) = DomBuilderSpace m
563545 textNode = liftTextNode
564546 element elementTag cfg (RequesterT child) = RequesterT $ do
565547 r <- ask
566− let cfg' = liftElementConfig cfg
567− (el, (a, e)) <- lift $ lift $ element elementTag cfg' $ runReaderT (runEventWriterT child) r
548+ (el, (a, e)) <- lift $ lift $ element elementTag cfg $ runReaderT (runEventWriterT child) r
568549 tellEvent e
569550 return (el, a)
570− inputElement cfg = lift $ inputElement $ cfg & inputElementConfig_elementConfig %~ liftElementConfig
571− textAreaElement cfg = lift $ textAreaElement $ cfg & textAreaElementConfig_elementConfig %~ liftElementConfig
551+ inputElement = lift . inputElement
552+ textAreaElement = lift . textAreaElement
572553 selectElement cfg (RequesterT child) = RequesterT $ do
573554 r <- ask
574− let cfg' = cfg & selectElementConfig_elementConfig %~ liftElementConfig
575− (el, (a, e)) <- lift $ lift $ selectElement cfg' $ runReaderT (runEventWriterT child) r
555+ (el, (a, e)) <- lift $ lift $ selectElement cfg $ runReaderT (runEventWriterT child) r
576556 tellEvent e
577557 return (el, a)
578558 placeRawElement = lift . placeRawElement
579− wrapRawElement e cfg = lift $ wrapRawElement e $ cfg
580− { _rawElementConfig_eventSpec = _rawElementConfig_eventSpec cfg
581− }
559+ wrapRawElement e = lift . wrapRawElement e
582560
583561instance (DomBuilder t m, MonadHold t m, MonadFix m, Semigroup w, Monoid w) => DomBuilder t (EventWriterT t w m) where
584562 type DomBuilderSpace (EventWriterT t w m) = DomBuilderSpace m
585563 textNode = liftTextNode
586564 element elementTag cfg child = do
587− let cfg' = liftElementConfig cfg
588− (el, (a, e)) <- lift $ element elementTag cfg' $ runEventWriterT child
565+ (el, (a, e)) <- lift $ element elementTag cfg $ runEventWriterT child
589566 tellEvent e
590567 return (el, a)
591− inputElement cfg = lift $ inputElement $ cfg & inputElementConfig_elementConfig %~ liftElementConfig
592− textAreaElement cfg = lift $ textAreaElement $ cfg & textAreaElementConfig_elementConfig %~ liftElementConfig
568+ inputElement = lift . inputElement
569+ textAreaElement = lift . textAreaElement
593570 selectElement cfg child = do
594− let cfg' = cfg & selectElementConfig_elementConfig %~ liftElementConfig
595− (el, (a, e)) <- lift $ selectElement cfg' $ runEventWriterT child
571+ (el, (a, e)) <- lift $ selectElement cfg $ runEventWriterT child
596572 tellEvent e
597573 return (el, a)
598574 placeRawElement = lift . placeRawElement
599− wrapRawElement e cfg = lift $ wrapRawElement e $ cfg
600− { _rawElementConfig_eventSpec = _rawElementConfig_eventSpec cfg
601− }
575+ wrapRawElement e = lift . wrapRawElement e
602576
603577-- * Convenience functions
604578
605−--TODO: Move/replace
606−class Functor1 (f :: (k -> *) -> *) where
607− type Functor1Constraint f (a :: k -> *) (b :: k -> *) :: Constraint
608− type Functor1Constraint f a b = ()
609− fmap1 :: Functor1Constraint f a b => (forall x. a x -> b x) -> f a -> f b
610−
611−instance Functor1 (ElementConfig er t) where
612− type Functor1Constraint (ElementConfig er t) a b = DomBuilderSpace a ~ DomBuilderSpace b
613− {-# INLINABLE fmap1 #-}
614− fmap1 _ cfg = cfg
615− { _elementConfig_eventSpec = _elementConfig_eventSpec cfg
616− }
617−
618−instance Functor1 (InputElementConfig er t) where
619− type Functor1Constraint (InputElementConfig er t) a b = Functor1Constraint (ElementConfig er t) a b
620− fmap1 f cfg = cfg & inputElementConfig_elementConfig %~ fmap1 f
621−
622−instance Functor1 (TextAreaElementConfig er t) where
623− type Functor1Constraint (TextAreaElementConfig er t) a b = Functor1Constraint (ElementConfig er t) a b
624− fmap1 f cfg = cfg & textAreaElementConfig_elementConfig %~ fmap1 f
625−
626−instance Functor1 (SelectElementConfig er t) where
627− type Functor1Constraint (SelectElementConfig er t) a b = Functor1Constraint (ElementConfig er t) a b
628− fmap1 f cfg = cfg & selectElementConfig_elementConfig %~ fmap1 f
629−
630−instance Functor1 (RawElementConfig er t) where
631− type Functor1Constraint (RawElementConfig er t) a b = DomBuilderSpace a ~ DomBuilderSpace b
632− {-# INLINABLE fmap1 #-}
633− fmap1 _ cfg = cfg
634− { _rawElementConfig_eventSpec = _rawElementConfig_eventSpec cfg
635− }
636−
637579class HasDomEvent t target eventName where
638580 type DomEventType target eventName :: *
639581 domEvent :: EventName eventName -> target -> Event t (DomEventType target eventName)
@@ -685,17 +627,8 @@ liftWithStateless a = liftWith $ \run -> a $ \x -> fromStT (Proxy :: Proxy t) <$
685627liftTextNode :: (MonadTrans f, DomBuilder t m) => TextNodeConfig t -> f m (TextNode (DomBuilderSpace m) t)
686628liftTextNode = lift . textNode
687629
688−liftElement :: LiftDomBuilder t f m => Text -> ElementConfig er t (f m) -> f m a -> f m (Element er (DomBuilderSpace m) t, a)
689−liftElement elementTag cfg child = liftWithStateless $ \run -> element elementTag (fmap1 run cfg) $ run child
690−
691−liftInputElement :: LiftDomBuilder t f m => InputElementConfig er t (f m) -> f m (InputElement er (DomBuilderSpace m) t)
692−liftInputElement cfg = liftWithStateless $ \run -> inputElement $ fmap1 run cfg
693−
694−liftTextAreaElement :: LiftDomBuilder t f m => TextAreaElementConfig er t (f m) -> f m (TextAreaElement er (DomBuilderSpace m) t)
695−liftTextAreaElement cfg = liftWithStateless $ \run -> textAreaElement $ fmap1 run cfg
696−
697−liftWrapRawElement :: LiftDomBuilder t f m => RawElement (DomBuilderSpace m) -> RawElementConfig er t (f m) -> f m (Element er (DomBuilderSpace m) t)
698−liftWrapRawElement e es = liftWithStateless $ \run -> wrapRawElement e $ fmap1 run es
630+liftElement :: LiftDomBuilder t f m => Text -> ElementConfig er t (DomBuilderSpace m) -> f m a -> f m (Element er (DomBuilderSpace m) t, a)
631+liftElement elementTag cfg child = liftWithStateless $ \run -> element elementTag cfg $ run child
699632
700633class (Reflex t, Monad m) => DomRenderHook t m | m -> t where
701634 withRenderHook :: (forall x. JSM x -> JSM x) -> m a -> m a