on develop help sign in
Improve efficiency of selectElement for ImmediateDomBuilderT
commitebb00bd2e10b293a91b2d5cb1b595dab1c34434c authorDaniel Haraj <dan@obsidian.systems> dateSat 28 Jan 2017, 20:34 (10 years ago) parentbc8bdc3
2 files changed+17−9
src/Reflex/Dom/Builder/Class.hs+11−5 src/Reflex/Dom/Builder/Immediate.hs+6−4
src/Reflex/Dom/Builder/Class.hs+11−5
@@ -287,14 +287,14 @@ instance (Reflex t, DomSpace (DomBuilderSpace m)) => Default (RawElementConfig E
287287
288288data SelectElementConfig er t m = SelectElementConfig
289289 { _selectElementConfig_initialValue :: Text
290− , _selectElementConfig_setValue :: Event t Text
290+ , _selectElementConfig_setValue :: Maybe (Event t Text)
291291 , _selectElementConfig_elementConfig :: ElementConfig er t m
292292 }
293293
294294instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (SelectElementConfig er t m) where
295295 def = SelectElementConfig
296296 { _selectElementConfig_initialValue = ""
297− , _selectElementConfig_setValue = never
297+ , _selectElementConfig_setValue = Nothing
298298 , _selectElementConfig_elementConfig = def
299299 }
300300
@@ -313,6 +313,7 @@ concat <$> mapM (uncurry makeLensesWithoutField)
313313 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
314314 , (["_elementConfig_modifyAttributes"], ''ElementConfig)
315315 , (["_textAreaElementConfig_setValue"], ''TextAreaElementConfig)
316+ , (["_selectElementConfig_setValue"], ''SelectElementConfig)
316317 ]
317318
318319-- | 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'.
@@ -369,9 +370,14 @@ textAreaElementConfig_setValue =
369370 setter t e = t { _textAreaElementConfig_setValue = Just e }
370371 in lens getter setter
371372
372−concat <$> mapM makeLenses
373− [ ''SelectElementConfig
374− ]
373+-- | 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'.
374+selectElementConfig_setValue :: Reflex t => Lens (SelectElementConfig er t m) (SelectElementConfig er t m) (Event t Text) (Event t Text)
375+selectElementConfig_setValue =
376+ let getter t = case _selectElementConfig_setValue t of
377+ Nothing -> never
378+ Just e -> e
379+ setter t e = t { _selectElementConfig_setValue = Just e }
380+ in lens getter setter
375381
376382class InitialAttributes a where
377383 initialAttributes :: Lens' a (Map AttributeName Text)
src/Reflex/Dom/Builder/Immediate.hs+6−4
@@ -351,7 +351,7 @@ 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 <- case (_textAreaElementConfig_setValue cfg) of
354+ valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
355355 Nothing -> return never
356356 Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
357357 TextArea.setValue domTextAreaElement $ Just v'
@@ -376,9 +376,11 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
376376 Just v0 <- Select.getValue domSelectElement
377377 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
378378 valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
379− valueChangedBySetValue <- performEvent $ ffor (cfg ^. selectElementConfig_setValue) $ \v' -> do
380− Select.setValue domSelectElement $ Just v'
381− getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
379+ valueChangedBySetValue <- case _selectElementConfig_setValue cfg of
380+ Nothing -> return never
381+ Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
382+ Select.setValue domSelectElement $ Just v'
383+ getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
382384 v <- holdDyn v0 $ leftmost
383385 [ valueChangedBySetValue
384386 , valueChangedByUI