on develop help sign in
Add missing comment lenses and widget functions
cf61c5bTom Smalley
reflex-dom-core/src/Reflex/Dom/Builder/Class.hs+15
@@ -425,6 +425,7 @@ data SelectElement er d t = SelectElement
425#ifdef USE_TEMPLATE_HASKELL
425#ifdef USE_TEMPLATE_HASKELL
426concat <$> mapM (uncurry makeLensesWithoutField)
426concat <$> mapM (uncurry makeLensesWithoutField)
427 [ (["_textNodeConfig_setContents"], ''TextNodeConfig)
427 [ (["_textNodeConfig_setContents"], ''TextNodeConfig)
428+ , (["_commentNodeConfig_setContents"], ''CommentNodeConfig)
428 , ([ "_inputElementConfig_setValue"
429 , ([ "_inputElementConfig_setValue"
429 , "_inputElementConfig_setChecked" ], ''InputElementConfig)
430 , "_inputElementConfig_setChecked" ], ''InputElementConfig)
430 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
431 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
@@ -441,6 +442,13 @@ textNodeConfig_setContents =
441 setter t e = t { _textNodeConfig_setContents = Just e }
442 setter t e = t { _textNodeConfig_setContents = Just e }
442 in lens getter setter
443 in lens getter setter
443
444
445+-- | This lens is technically illegal. The implementation of 'TextNodeConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'TextNodeConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
446+commentNodeConfig_setContents :: Reflex t => Lens (CommentNodeConfig t) (CommentNodeConfig t) (Event t Text) (Event t Text)
447+commentNodeConfig_setContents =
448+ let getter = fromMaybe never . _commentNodeConfig_setContents
449+ setter t e = t { _commentNodeConfig_setContents = Just e }
450+ in lens getter setter
451+
444-- | This lens is technically illegal. The implementation of 'InputElementConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'InputElementConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
452-- | This lens is technically illegal. The implementation of 'InputElementConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'InputElementConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
445inputElementConfig_setValue :: Reflex t => Lens (InputElementConfig er t m) (InputElementConfig er t m) (Event t Text) (Event t Text)
453inputElementConfig_setValue :: Reflex t => Lens (InputElementConfig er t m) (InputElementConfig er t m) (Event t Text) (Event t Text)
446inputElementConfig_setValue =
454inputElementConfig_setValue =
@@ -553,6 +561,7 @@ instance (MountableDomBuilder t m, PerformEvent t m, MonadFix m, MonadHold t m)
553instance (DomBuilder t m, Monoid w, MonadHold t m, MonadFix m) => DomBuilder t (DynamicWriterT t w m) where
561instance (DomBuilder t m, Monoid w, MonadHold t m, MonadFix m) => DomBuilder t (DynamicWriterT t w m) where
554 type DomBuilderSpace (DynamicWriterT t w m) = DomBuilderSpace m
562 type DomBuilderSpace (DynamicWriterT t w m) = DomBuilderSpace m
555 textNode = liftTextNode
563 textNode = liftTextNode
564+ commentNode = liftCommentNode
556 element elementTag cfg (DynamicWriterT child) = DynamicWriterT $ do
565 element elementTag cfg (DynamicWriterT child) = DynamicWriterT $ do
557 s <- get
566 s <- get
558 (el, (a, newS)) <- lift $ element elementTag cfg $ runStateT child s
567 (el, (a, newS)) <- lift $ element elementTag cfg $ runStateT child s
@@ -571,6 +580,7 @@ instance (DomBuilder t m, Monoid w, MonadHold t m, MonadFix m) => DomBuilder t (
571instance (DomBuilder t m, MonadHold t m, MonadFix m) => DomBuilder t (RequesterT t request response m) where
580instance (DomBuilder t m, MonadHold t m, MonadFix m) => DomBuilder t (RequesterT t request response m) where
572 type DomBuilderSpace (RequesterT t request response m) = DomBuilderSpace m
581 type DomBuilderSpace (RequesterT t request response m) = DomBuilderSpace m
573 textNode = liftTextNode
582 textNode = liftTextNode
583+ commentNode = liftCommentNode
574 element elementTag cfg (RequesterT child) = RequesterT $ do
584 element elementTag cfg (RequesterT child) = RequesterT $ do
575 r <- ask
585 r <- ask
576 old <- get
586 old <- get
@@ -591,6 +601,7 @@ instance (DomBuilder t m, MonadHold t m, MonadFix m) => DomBuilder t (RequesterT
591instance (DomBuilder t m, MonadHold t m, MonadFix m, Semigroup w) => DomBuilder t (EventWriterT t w m) where
601instance (DomBuilder t m, MonadHold t m, MonadFix m, Semigroup w) => DomBuilder t (EventWriterT t w m) where
592 type DomBuilderSpace (EventWriterT t w m) = DomBuilderSpace m
602 type DomBuilderSpace (EventWriterT t w m) = DomBuilderSpace m
593 textNode = liftTextNode
603 textNode = liftTextNode
604+ commentNode = liftCommentNode
594 element elementTag cfg (EventWriterT child) = EventWriterT $ do
605 element elementTag cfg (EventWriterT child) = EventWriterT $ do
595 old <- get
606 old <- get
596 (el, (a, new)) <- lift $ element elementTag cfg $ runStateT child old
607 (el, (a, new)) <- lift $ element elementTag cfg $ runStateT child old
@@ -609,6 +620,7 @@ instance (DomBuilder t m, MonadHold t m, MonadFix m, Semigroup w) => DomBuilder
609instance (DomBuilder t m, MonadFix m, MonadHold t m, Group q, Query q, Additive q) => DomBuilder t (QueryT t q m) where
620instance (DomBuilder t m, MonadFix m, MonadHold t m, Group q, Query q, Additive q) => DomBuilder t (QueryT t q m) where
610 type DomBuilderSpace (QueryT t q m) = DomBuilderSpace m
621 type DomBuilderSpace (QueryT t q m) = DomBuilderSpace m
611 textNode = liftTextNode
622 textNode = liftTextNode
623+ commentNode = liftCommentNode
612 element elementTag cfg (QueryT child) = QueryT $ do
624 element elementTag cfg (QueryT child) = QueryT $ do
613 s <- get
625 s <- get
614 (e, (a, newS)) <- lift $ element elementTag cfg $ runStateT child s
626 (e, (a, newS)) <- lift $ element elementTag cfg $ runStateT child s
@@ -677,6 +689,9 @@ liftWithStateless a = liftWith $ \run -> a $ fmap (fromStT (Proxy :: Proxy t)) .
677liftTextNode :: (MonadTrans f, DomBuilder t m) => TextNodeConfig t -> f m (TextNode (DomBuilderSpace m) t)
689liftTextNode :: (MonadTrans f, DomBuilder t m) => TextNodeConfig t -> f m (TextNode (DomBuilderSpace m) t)
678liftTextNode = lift . textNode
690liftTextNode = lift . textNode
679
691
692+liftCommentNode :: (MonadTrans f, DomBuilder t m) => CommentNodeConfig t -> f m (CommentNode (DomBuilderSpace m) t)
693+liftCommentNode = lift . commentNode
694+
680liftElement :: LiftDomBuilder t f m => Text -> ElementConfig er t (DomBuilderSpace m) -> f m a -> f m (Element er (DomBuilderSpace m) t, a)
695liftElement :: LiftDomBuilder t f m => Text -> ElementConfig er t (DomBuilderSpace m) -> f m a -> f m (Element er (DomBuilderSpace m) t, a)
681liftElement elementTag cfg child = liftWithStateless $ \run -> element elementTag cfg $ run child
696liftElement elementTag cfg child = liftWithStateless $ \run -> element elementTag cfg $ run child
682
697
reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs+15
@@ -16,6 +16,8 @@ module Reflex.Dom.Widget.Basic
16 -- * Displaying Values
16 -- * Displaying Values
17 , text
17 , text
18 , dynText
18 , dynText
19+ , comment
20+ , dynComment
19 , display
21 , display
20 , button
22 , button
21 , dyn
23 , dyn
@@ -120,6 +122,19 @@ dynText t = do
120 ]
122 ]
121 notReadyUntil postBuild
123 notReadyUntil postBuild
122
124
125+comment :: DomBuilder t m => Text -> m ()
126+comment t = void $ commentNode $ def & commentNodeConfig_initialContents .~ t
127+
128+{-# INLINABLE dynComment #-}
129+dynComment :: forall t m. (PostBuild t m, DomBuilder t m) => Dynamic t Text -> m ()
130+dynComment t = do
131+ postBuild <- getPostBuild
132+ void $ commentNode $ (def :: CommentNodeConfig t) & commentNodeConfig_setContents .~ leftmost
133+ [ updated t
134+ , tag (current t) postBuild
135+ ]
136+ notReadyUntil postBuild
137+
123display :: (PostBuild t m, DomBuilder t m, Show a) => Dynamic t a -> m ()
138display :: (PostBuild t m, DomBuilder t m, Show a) => Dynamic t a -> m ()
124display = dynText . fmap (T.pack . show)
139display = dynText . fmap (T.pack . show)
125
140