@@ -25,6 +25,9 @@ module Reflex.Dom.Builder.Class
2525
2626import Reflex.Class as Reflex
2727import Reflex.Dom.Builder.Class.Events
28+#ifdef USE_TEMPLATE_HASKELL
29+import Reflex.Dom.Builder.Class.TH
30+#endif
2831import Reflex.DynamicWriter
2932import Reflex.EventWriter
3033import Reflex.PerformEvent.Class
@@ -40,6 +43,7 @@ import Data.Default
4043import Data.Functor.Misc
4144import Data.Map (Map)
4245import qualified Data.Map as Map
46+import Data.Maybe
4347import Data.Proxy
4448import Data.Semigroup
4549import Data.String
@@ -86,11 +90,6 @@ class (Monad m, Reflex t, DomSpace (DomBuilderSpace m), MonadAdjust t m) => DomB
8690 => Text -> ElementConfig er t m -> m a -> m (Element er (DomBuilderSpace m) t, a)
8791 element t cfg child = liftWith $ \run -> element t (liftElementConfig cfg) $ run child
8892 {-# INLINABLE element #-}
89− {-
90− -- | Create a placeholder in the DOM, with the ability to insert new DOM before it
91− -- The provided DOM will be executed after the current frame, so it will not be affected by any occurrences that are concurrent with the occurrence that created it
92− placeholder :: PlaceholderConfig above t m -> m (Placeholder above t)
93−-}
9493 inputElement :: InputElementConfig er t m -> m (InputElement er (DomBuilderSpace m) t)
9594 default inputElement :: ( MonadTransControl f
9695 , m ~ f m'
@@ -221,7 +220,7 @@ stopPropagation = mempty { _eventFlags_propagation = Propagation_Stop }
221220data ElementConfig er t m
222221 = ElementConfig { _elementConfig_namespace :: Maybe Namespace
223222 , _elementConfig_initialAttributes :: Map AttributeName Text
224− , _elementConfig_modifyAttributes :: Event t (Map AttributeName (Maybe Text))
223+ , _elementConfig_modifyAttributes :: Maybe (Event t (Map AttributeName (Maybe Text)))
225224 , _elementConfig_eventSpec :: EventSpec (DomBuilderSpace m) er
226225 }
227226
@@ -232,13 +231,6 @@ elementConfig_namespace f (ElementConfig a b c d) = (\a' -> ElementConfig a' b c
232231elementConfig_initialAttributes :: Lens' (ElementConfig er t m) (Map AttributeName Text)
233232elementConfig_initialAttributes f (ElementConfig a b c d) = (\b' -> ElementConfig a b' c d) <$> f b
234233{-# INLINE elementConfig_initialAttributes #-}
235−elementConfig_modifyAttributes :: Lens
236− (ElementConfig er t1 m)
237− (ElementConfig er t2 m)
238− (Event t1 (Map AttributeName (Maybe Text)))
239− (Event t2 (Map AttributeName (Maybe Text)))
240−elementConfig_modifyAttributes f (ElementConfig a b c d) = (\c' -> ElementConfig a b c' d) <$> f c
241−{-# INLINE elementConfig_modifyAttributes #-}
242234elementConfig_eventSpec :: Lens
243235 (ElementConfig er1 t m1)
244236 (ElementConfig er2 t m2)
@@ -253,41 +245,11 @@ data Element er d t
253245 , _element_raw :: RawElement d
254246 }
255247
256−data PlaceholderConfig above t m
257− = PlaceholderConfig { _placeholderConfig_insertAbove :: Event t (m above)
258− , _placeholderConfig_deleteSelf :: Event t ()
259− }
260−
261−#ifndef USE_TEMPLATE_HASKELL
262−placeholderConfig_insertAbove :: Lens
263− (PlaceholderConfig above1 t m1)
264− (PlaceholderConfig above2 t m2)
265− (Event t (m1 above1))
266− (Event t (m2 above2))
267−placeholderConfig_insertAbove f (PlaceholderConfig a b) = (\a' -> PlaceholderConfig a' b) <$> f a
268−{-# INLINE placeholderConfig_insertAbove #-}
269−placeholderConfig_deleteSelf :: Lens' (PlaceholderConfig above t m) (Event t ())
270−placeholderConfig_deleteSelf f (PlaceholderConfig a b) = (\b' -> PlaceholderConfig a b') <$> f b
271−{-# INLINE placeholderConfig_deleteSelf #-}
272−#endif
273−
274−instance Reflex t => Default (PlaceholderConfig above t m) where
275− {-# INLINABLE def #-}
276− def = PlaceholderConfig
277− { _placeholderConfig_insertAbove = never
278− , _placeholderConfig_deleteSelf = never
279− }
280−
281−data Placeholder above t
282− = Placeholder { _placeholder_insertedAbove :: Event t above
283− , _placeholder_deletedSelf :: Event t ()
284− }
285−
286248data InputElementConfig er t m
287249 = InputElementConfig { _inputElementConfig_initialValue :: Text
288− , _inputElementConfig_setValue :: Event t Text
250+ , _inputElementConfig_setValue :: Maybe (Event t Text)
289251 , _inputElementConfig_initialChecked :: Bool
290− , _inputElementConfig_setChecked :: Event t Bool
252+ , _inputElementConfig_setChecked :: Maybe (Event t Bool)
291253 , _inputElementConfig_elementConfig :: ElementConfig er t m
292254 }
293255
@@ -295,15 +257,9 @@ data InputElementConfig er t m
295257inputElementConfig_initialValue :: Lens' (InputElementConfig er t m) Text
296258inputElementConfig_initialValue f (InputElementConfig a b c d e) = (\a' -> InputElementConfig a' b c d e) <$> f a
297259{-# INLINE inputElementConfig_initialValue #-}
298−inputElementConfig_setValue :: Lens' (InputElementConfig er t m) (Event t Text)
299−inputElementConfig_setValue f (InputElementConfig a b c d e) = (\b' -> InputElementConfig a b' c d e) <$> f b
300−{-# INLINE inputElementConfig_setValue #-}
301260inputElementConfig_initialChecked :: Lens' (InputElementConfig er t m) Bool
302261inputElementConfig_initialChecked f (InputElementConfig a b c d e) = (\c' -> InputElementConfig a b c' d e) <$> f c
303262{-# INLINE inputElementConfig_initialChecked #-}
304−inputElementConfig_setChecked :: Lens' (InputElementConfig er t m) (Event t Bool)
305−inputElementConfig_setChecked f (InputElementConfig a b c d e) = (\d' -> InputElementConfig a b c d' e) <$> f d
306−{-# INLINE inputElementConfig_setChecked #-}
307263inputElementConfig_elementConfig :: Lens
308264 (InputElementConfig er1 t m1)
309265 (InputElementConfig er2 t m2)
@@ -317,9 +273,9 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (InputElementCo
317273 {-# INLINABLE def #-}
318274 def = InputElementConfig
319275 { _inputElementConfig_initialValue = ""
320− , _inputElementConfig_setValue = never
276+ , _inputElementConfig_setValue = Nothing
321277 , _inputElementConfig_initialChecked = False
322− , _inputElementConfig_setChecked = never
278+ , _inputElementConfig_setChecked = Nothing
323279 , _inputElementConfig_elementConfig = def
324280 }
325281
@@ -336,7 +292,7 @@ data InputElement er d t
336292
337293data TextAreaElementConfig er t m
338294 = TextAreaElementConfig { _textAreaElementConfig_initialValue :: Text
339− , _textAreaElementConfig_setValue :: Event t Text
295+ , _textAreaElementConfig_setValue :: Maybe (Event t Text)
340296 , _textAreaElementConfig_elementConfig :: ElementConfig er t m
341297 }
342298
@@ -344,9 +300,6 @@ data TextAreaElementConfig er t m
344300textAreaElementConfig_initialValue :: Lens' (TextAreaElementConfig er t m) Text
345301textAreaElementConfig_initialValue f (TextAreaElementConfig a b c) = (\a' -> TextAreaElementConfig a' b c) <$> f a
346302{-# INLINE textAreaElementConfig_initialValue #-}
347−textAreaElementConfig_setValue :: Lens' (TextAreaElementConfig er t m) (Event t Text)
348−textAreaElementConfig_setValue f (TextAreaElementConfig a b c) = (\b' -> TextAreaElementConfig a b' c) <$> f b
349−{-# INLINE textAreaElementConfig_setValue #-}
350303textAreaElementConfig_elementConfig :: Lens
351304 (TextAreaElementConfig er1 t m1)
352305 (TextAreaElementConfig er2 t m2)
@@ -360,7 +313,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (TextAreaElemen
360313 {-# INLINABLE def #-}
361314 def = TextAreaElementConfig
362315 { _textAreaElementConfig_initialValue = ""
363− , _textAreaElementConfig_setValue = never
316+ , _textAreaElementConfig_setValue = Nothing
364317 , _textAreaElementConfig_elementConfig = def
365318 }
366319
@@ -379,18 +332,11 @@ extractRawElementConfig cfg = RawElementConfig
379332 }
380333
381334data RawElementConfig er t m = RawElementConfig
382− { _rawElementConfig_modifyAttributes :: Event t (Map AttributeName (Maybe Text))
335+ { _rawElementConfig_modifyAttributes :: Maybe (Event t (Map AttributeName (Maybe Text)))
383336 , _rawElementConfig_eventSpec :: EventSpec (DomBuilderSpace m) er
384337 }
385338
386339#ifndef USE_TEMPLATE_HASKELL
387−rawElementConfig_modifyAttributes :: Lens
388− (RawElementConfig er t1 m)
389− (RawElementConfig er t2 m)
390− (Event t1 (Map AttributeName (Maybe Text)))
391− (Event t2 (Map AttributeName (Maybe Text)))
392−rawElementConfig_modifyAttributes f (RawElementConfig a b) = (\a' -> RawElementConfig a' b) <$> f a
393−{-# INLINE rawElementConfig_modifyAttributes #-}
394340rawElementConfig_eventSpec :: Lens
395341 (RawElementConfig er1 t m1)
396342 (RawElementConfig er2 t m2)
@@ -402,13 +348,13 @@ rawElementConfig_eventSpec f (RawElementConfig a b) = (\b' -> RawElementConfig a
402348
403349instance (Reflex t, DomSpace (DomBuilderSpace m)) => Default (RawElementConfig EventResult t m) where
404350 def = RawElementConfig
405− { _rawElementConfig_modifyAttributes = never
351+ { _rawElementConfig_modifyAttributes = Nothing
406352 , _rawElementConfig_eventSpec = def
407353 }
408354
409355data SelectElementConfig er t m = SelectElementConfig
410356 { _selectElementConfig_initialValue :: Text
411− , _selectElementConfig_setValue :: Event t Text
357+ , _selectElementConfig_setValue :: Maybe (Event t Text)
412358 , _selectElementConfig_elementConfig :: ElementConfig er t m
413359 }
414360
@@ -416,9 +362,6 @@ data SelectElementConfig er t m = SelectElementConfig
416362selectElementConfig_initialValue :: Lens' (SelectElementConfig er t m) Text
417363selectElementConfig_initialValue f (SelectElementConfig a b c) = (\a' -> SelectElementConfig a' b c) <$> f a
418364{-# INLINE selectElementConfig_initialValue #-}
419−selectElementConfig_setValue :: Lens' (SelectElementConfig er t m) (Event t Text)
420−selectElementConfig_setValue f (SelectElementConfig a b c) = (\b' -> SelectElementConfig a b' c) <$> f b
421−{-# INLINE selectElementConfig_setValue #-}
422365selectElementConfig_elementConfig :: Lens
423366 (SelectElementConfig er1 t m1)
424367 (SelectElementConfig er2 t m2)
@@ -431,7 +374,7 @@ selectElementConfig_elementConfig f (SelectElementConfig a b c) = (\c' -> Select
431374instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (SelectElementConfig er t m) where
432375 def = SelectElementConfig
433376 { _selectElementConfig_initialValue = ""
434− , _selectElementConfig_setValue = never
377+ , _selectElementConfig_setValue = Nothing
435378 , _selectElementConfig_elementConfig = def
436379 }
437380
@@ -444,43 +387,65 @@ data SelectElement er d t = SelectElement
444387 }
445388
446389#ifdef USE_TEMPLATE_HASKELL
447−makeLensesFor
448− [("_textNodeConfig_initialContents", "textNodeConfig_initialContents")]
449− ''TextNodeConfig
390+concat <$> mapM (uncurry makeLensesWithoutField)
391+ [ (["_textNodeConfig_setContents"], ''TextNodeConfig)
392+ , ([ "_inputElementConfig_setValue"
393+ , "_inputElementConfig_setChecked" ], ''InputElementConfig)
394+ , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
395+ , (["_elementConfig_modifyAttributes"], ''ElementConfig)
396+ , (["_textAreaElementConfig_setValue"], ''TextAreaElementConfig)
397+ , (["_selectElementConfig_setValue"], ''SelectElementConfig)
398+ ]
450399#endif
451400
452401-- | 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'.
453402textNodeConfig_setContents :: Reflex t => Lens (TextNodeConfig t) (TextNodeConfig t) (Event t Text) (Event t Text)
454403textNodeConfig_setContents =
455− let getter t = case _textNodeConfig_setContents t of
456− Nothing -> never
457− Just e -> e
404+ let getter = fromMaybe never . _textNodeConfig_setContents
458405 setter t e = t { _textNodeConfig_setContents = Just e }
459406 in lens getter setter
460407
461−#ifdef USE_TEMPLATE_HASKELL
462−concat <$> mapM makeLenses
463− [ ''ElementConfig
464− , ''PlaceholderConfig
465− , ''InputElementConfig
466− , ''TextAreaElementConfig
467− , ''SelectElementConfig
468− , ''RawElementConfig
469− ]
470−#endif
408+-- | 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'.
409+inputElementConfig_setValue :: Reflex t => Lens (InputElementConfig er t m) (InputElementConfig er t m) (Event t Text) (Event t Text)
410+inputElementConfig_setValue =
411+ let getter = fromMaybe never . _inputElementConfig_setValue
412+ setter t e = t { _inputElementConfig_setValue = Just e }
413+ in lens getter setter
414+
415+-- | 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'.
416+inputElementConfig_setChecked :: Reflex t => Lens (InputElementConfig er t m) (InputElementConfig er t m) (Event t Bool) (Event t Bool)
417+inputElementConfig_setChecked =
418+ let getter = fromMaybe never . _inputElementConfig_setChecked
419+ setter t e = t { _inputElementConfig_setChecked = Just e }
420+ in lens getter setter
471421
472−class CanDeleteSelf t a | a -> t where
473− deleteSelf :: Lens' a (Event t ())
422+-- | This lens is technically illegal. The implementation of 'RawElementConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'RawElementConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
423+rawElementConfig_modifyAttributes :: Reflex t => Lens (RawElementConfig er t m) (RawElementConfig er t m) (Event t (Map AttributeName (Maybe Text))) (Event t (Map AttributeName (Maybe Text)))
424+rawElementConfig_modifyAttributes =
425+ let getter = fromMaybe never . _rawElementConfig_modifyAttributes
426+ setter t e = t { _rawElementConfig_modifyAttributes = Just e }
427+ in lens getter setter
474428
475−instance CanDeleteSelf t (PlaceholderConfig above t m) where
476− {-# INLINABLE deleteSelf #-}
477− deleteSelf = placeholderConfig_deleteSelf
429+-- | This lens is technically illegal. The implementation of 'RawElementConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'RawElementConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
430+elementConfig_modifyAttributes :: Reflex t => Lens (ElementConfig er t m) (ElementConfig er t m) (Event t (Map AttributeName (Maybe Text))) (Event t (Map AttributeName (Maybe Text)))
431+elementConfig_modifyAttributes =
432+ let getter = fromMaybe never . _elementConfig_modifyAttributes
433+ setter t e = t { _elementConfig_modifyAttributes = Just e }
434+ in lens getter setter
478435
479−class InsertAbove t m above above' a a' | a -> t m above, a' -> t m above', a above' -> a', a' above -> a where
480− insertAbove :: Lens a a' (Event t (m above)) (Event t (m above'))
436+-- | This lens is technically illegal. The implementation of 'TextAreaElementConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'TextAreaElementConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
437+textAreaElementConfig_setValue :: Reflex t => Lens (TextAreaElementConfig er t m) (TextAreaElementConfig er t m) (Event t Text) (Event t Text)
438+textAreaElementConfig_setValue =
439+ let getter = fromMaybe never . _textAreaElementConfig_setValue
440+ setter t e = t { _textAreaElementConfig_setValue = Just e }
441+ in lens getter setter
481442
482−instance InsertAbove t m above above' (PlaceholderConfig above t m) (PlaceholderConfig above' t m) where
483− insertAbove = placeholderConfig_insertAbove
443+-- | This lens is technically illegal. The implementation of 'SelectElementConfig' uses a 'Maybe' under the hood for efficiency reasons. However, always interacting with 'SelectElementConfig' via lenses will always behave correctly, and if you pattern match on it, you should always treat 'Nothing' as 'never'.
444+selectElementConfig_setValue :: Reflex t => Lens (SelectElementConfig er t m) (SelectElementConfig er t m) (Event t Text) (Event t Text)
445+selectElementConfig_setValue =
446+ let getter = fromMaybe never . _selectElementConfig_setValue
447+ setter t e = t { _selectElementConfig_setValue = Just e }
448+ in lens getter setter
484449
485450class InitialAttributes a where
486451 initialAttributes :: Lens' a (Map AttributeName Text)
@@ -502,7 +467,7 @@ instance InitialAttributes (SelectElementConfig er t m) where
502467 initialAttributes = selectElementConfig_elementConfig . elementConfig_initialAttributes
503468
504469class ModifyAttributes t a | a -> t where
505− modifyAttributes :: Lens' a (Event t (Map AttributeName (Maybe Text)))
470+ modifyAttributes :: Reflex t => Lens' a (Event t (Map AttributeName (Maybe Text)))
506471
507472instance ModifyAttributes t (ElementConfig er t m) where
508473 {-# INLINABLE modifyAttributes #-}
@@ -536,7 +501,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (ElementConfig
536501 def = ElementConfig
537502 { _elementConfig_namespace = Nothing
538503 , _elementConfig_initialAttributes = mempty
539− , _elementConfig_modifyAttributes = never
504+ , _elementConfig_modifyAttributes = Nothing
540505 , _elementConfig_eventSpec = def
541506 }
542507
@@ -623,12 +588,6 @@ instance Functor1 (ElementConfig er t) where
623588 { _elementConfig_eventSpec = _elementConfig_eventSpec cfg
624589 }
625590
626−instance Reflex t => Functor1 (PlaceholderConfig above t) where
627− {-# INLINABLE fmap1 #-}
628− fmap1 f cfg = cfg
629− { _placeholderConfig_insertAbove = f <$> _placeholderConfig_insertAbove cfg
630− }
631−
632591instance Functor1 (InputElementConfig er t) where
633592 type Functor1Constraint (InputElementConfig er t) a b = Functor1Constraint (ElementConfig er t) a b
634593 fmap1 f cfg = cfg & inputElementConfig_elementConfig %~ fmap1 f
@@ -702,11 +661,6 @@ liftTextNode = lift . textNode
702661liftElement :: LiftDomBuilder t f m => Text -> ElementConfig er t (f m) -> f m a -> f m (Element er (DomBuilderSpace m) t, a)
703662liftElement elementTag cfg child = liftWithStateless $ \run -> element elementTag (fmap1 run cfg) $ run child
704663
705−{-
706−liftPlaceholder :: LiftDomBuilder t f m => PlaceholderConfig above t (f m) -> f m (Placeholder above t)
707−liftPlaceholder cfg = liftWithStateless $ \run -> placeholder $ fmap1 run cfg
708−-}
709−
710664liftInputElement :: LiftDomBuilder t f m => InputElementConfig er t (f m) -> f m (InputElement er (DomBuilderSpace m) t)
711665liftInputElement cfg = liftWithStateless $ \run -> inputElement $ fmap1 run cfg
712666