on develop help sign in
Improve efficiency of textAreaElement for ImmediateDomBuilderT
bc8bdc3Daniel Haraj
src/Reflex/Dom/Builder/Class.hs+13−4
@@ -248,7 +248,7 @@ data InputElement er d t
248
248
249data TextAreaElementConfig er t m
249data TextAreaElementConfig er t m
250 = TextAreaElementConfig { _textAreaElementConfig_initialValue :: Text
250 = TextAreaElementConfig { _textAreaElementConfig_initialValue :: Text
251− , _textAreaElementConfig_setValue :: Event t Text
251+ , _textAreaElementConfig_setValue :: Maybe (Event t Text)
252 , _textAreaElementConfig_elementConfig :: ElementConfig er t m
252 , _textAreaElementConfig_elementConfig :: ElementConfig er t m
253 }
253 }
254
254
@@ -256,7 +256,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (TextAreaElemen
256 {-# INLINABLE def #-}
256 {-# INLINABLE def #-}
257 def = TextAreaElementConfig
257 def = TextAreaElementConfig
258 { _textAreaElementConfig_initialValue = ""
258 { _textAreaElementConfig_initialValue = ""
259− , _textAreaElementConfig_setValue = never
259+ , _textAreaElementConfig_setValue = Nothing
260 , _textAreaElementConfig_elementConfig = def
260 , _textAreaElementConfig_elementConfig = def
261 }
261 }
262
262
@@ -312,6 +312,7 @@ concat <$> mapM (uncurry makeLensesWithoutField)
312 , "_inputElementConfig_setChecked" ], ''InputElementConfig)
312 , "_inputElementConfig_setChecked" ], ''InputElementConfig)
313 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
313 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
314 , (["_elementConfig_modifyAttributes"], ''ElementConfig)
314 , (["_elementConfig_modifyAttributes"], ''ElementConfig)
315+ , (["_textAreaElementConfig_setValue"], ''TextAreaElementConfig)
315 ]
316 ]
316
317
317-- | 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'.
318-- | 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'.
@@ -359,9 +360,17 @@ elementConfig_modifyAttributes =
359 setter t e = t { _elementConfig_modifyAttributes = Just e }
360 setter t e = t { _elementConfig_modifyAttributes = Just e }
360 in lens getter setter
361 in lens getter setter
361
362
363+-- | 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'.
364+textAreaElementConfig_setValue :: Reflex t => Lens (TextAreaElementConfig er t m) (TextAreaElementConfig er t m) (Event t Text) (Event t Text)
365+textAreaElementConfig_setValue =
366+ let getter t = case _textAreaElementConfig_setValue t of
367+ Nothing -> never
368+ Just e -> e
369+ setter t e = t { _textAreaElementConfig_setValue = Just e }
370+ in lens getter setter
371+
362concat <$> mapM makeLenses
372concat <$> mapM makeLenses
363− [ ''TextAreaElementConfig
364− , ''SelectElementConfig
373+ [ ''SelectElementConfig
365 ]
374 ]
366
375
367class InitialAttributes a where
376class InitialAttributes a where
src/Reflex/Dom/Builder/Immediate.hs+5−3
@@ -351,9 +351,11 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
351 Just v0 <- TextArea.getValue domTextAreaElement
351 Just v0 <- TextArea.getValue domTextAreaElement
352 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
352 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
353 valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
353 valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
354− valueChangedBySetValue <- performEvent $ ffor (cfg ^. textAreaElementConfig_setValue) $ \v' -> do
354+ valueChangedBySetValue <- case (_textAreaElementConfig_setValue cfg) of
355+ Nothing -> return never
356+ Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
355− TextArea.setValue domTextAreaElement $ Just v'
357+ TextArea.setValue domTextAreaElement $ Just v'
356− getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
358+ getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
357 v <- holdDyn v0 $ leftmost
359 v <- holdDyn v0 $ leftmost
358 [ valueChangedBySetValue
360 [ valueChangedBySetValue
359 , valueChangedByUI
361 , valueChangedByUI