on develop help sign in
Improve efficiency of textAreaElement for ImmediateDomBuilderT
commitbc8bdc3607ee76a737f84b60c3ee16bb81e969bc authorDaniel Haraj <dan@obsidian.systems> dateSat 28 Jan 2017, 20:31 (10 years ago) parentb07e026
2 files changed+18−7
src/Reflex/Dom/Builder/Class.hs+13−4 src/Reflex/Dom/Builder/Immediate.hs+5−3
src/Reflex/Dom/Builder/Class.hs+13−4
@@ -248,7 +248,7 @@ data InputElement er d t
248248
249249data TextAreaElementConfig er t m
250250 = TextAreaElementConfig { _textAreaElementConfig_initialValue :: Text
251− , _textAreaElementConfig_setValue :: Event t Text
251+ , _textAreaElementConfig_setValue :: Maybe (Event t Text)
252252 , _textAreaElementConfig_elementConfig :: ElementConfig er t m
253253 }
254254
@@ -256,7 +256,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (TextAreaElemen
256256 {-# INLINABLE def #-}
257257 def = TextAreaElementConfig
258258 { _textAreaElementConfig_initialValue = ""
259− , _textAreaElementConfig_setValue = never
259+ , _textAreaElementConfig_setValue = Nothing
260260 , _textAreaElementConfig_elementConfig = def
261261 }
262262
@@ -312,6 +312,7 @@ concat <$> mapM (uncurry makeLensesWithoutField)
312312 , "_inputElementConfig_setChecked" ], ''InputElementConfig)
313313 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
314314 , (["_elementConfig_modifyAttributes"], ''ElementConfig)
315+ , (["_textAreaElementConfig_setValue"], ''TextAreaElementConfig)
315316 ]
316317
317318-- | 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 =
359360 setter t e = t { _elementConfig_modifyAttributes = Just e }
360361 in lens getter setter
361362
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+
362372concat <$> mapM makeLenses
363− [ ''TextAreaElementConfig
364− , ''SelectElementConfig
373+ [ ''SelectElementConfig
365374 ]
366375
367376class InitialAttributes a where
src/Reflex/Dom/Builder/Immediate.hs+5−3
@@ -351,9 +351,11 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
351351 Just v0 <- TextArea.getValue domTextAreaElement
352352 let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
353353 valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
354− valueChangedBySetValue <- performEvent $ ffor (cfg ^. textAreaElementConfig_setValue) $ \v' -> do
355− TextArea.setValue domTextAreaElement $ Just v'
356− getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
354+ valueChangedBySetValue <- case (_textAreaElementConfig_setValue cfg) of
355+ Nothing -> return never
356+ Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
357+ TextArea.setValue domTextAreaElement $ Just v'
358+ getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
357359 v <- holdDyn v0 $ leftmost
358360 [ valueChangedBySetValue
359361 , valueChangedByUI