on develop help sign in
Improve efficiency of selectElement for ImmediateDomBuilderT
ebb00bdDaniel Haraj
src/Reflex/Dom/Builder/Class.hs+11−5
@@ -287,14 +287,14 @@ instance (Reflex t, DomSpace (DomBuilderSpace m)) => Default (RawElementConfig E
287
287
288data SelectElementConfig er t m = SelectElementConfig
288data SelectElementConfig er t m = SelectElementConfig
289 { _selectElementConfig_initialValue :: Text
289 { _selectElementConfig_initialValue :: Text
290− , _selectElementConfig_setValue :: Event t Text
290+ , _selectElementConfig_setValue :: Maybe (Event t Text)
291 , _selectElementConfig_elementConfig :: ElementConfig er t m
291 , _selectElementConfig_elementConfig :: ElementConfig er t m
292 }
292 }
293
293
294instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (SelectElementConfig er t m) where
294instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (SelectElementConfig er t m) where
295 def = SelectElementConfig
295 def = SelectElementConfig
296 { _selectElementConfig_initialValue = ""
296 { _selectElementConfig_initialValue = ""
297− , _selectElementConfig_setValue = never
297+ , _selectElementConfig_setValue = Nothing
298 , _selectElementConfig_elementConfig = def
298 , _selectElementConfig_elementConfig = def
299 }
299 }
300
300
@@ -313,6 +313,7 @@ concat <$> mapM (uncurry makeLensesWithoutField)
313 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
313 , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
314 , (["_elementConfig_modifyAttributes"], ''ElementConfig)
314 , (["_elementConfig_modifyAttributes"], ''ElementConfig)
315 , (["_textAreaElementConfig_setValue"], ''TextAreaElementConfig)
315 , (["_textAreaElementConfig_setValue"], ''TextAreaElementConfig)
316+ , (["_selectElementConfig_setValue"], ''SelectElementConfig)
316 ]
317 ]
317
318
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'.
319-- | 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 =
369 setter t e = t { _textAreaElementConfig_setValue = Just e }
370 setter t e = t { _textAreaElementConfig_setValue = Just e }
370 in lens getter setter
371 in lens getter setter
371
372
372−concat <$> mapM makeLenses
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'.
373− [ ''SelectElementConfig
374+selectElementConfig_setValue :: Reflex t => Lens (SelectElementConfig er t m) (SelectElementConfig er t m) (Event t Text) (Event t Text)
374− ]
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
375
381
376class InitialAttributes a where
382class InitialAttributes a where
377 initialAttributes :: Lens' a (Map AttributeName Text)
383 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
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 <- case (_textAreaElementConfig_setValue cfg) of
354+ valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
355 Nothing -> return never
355 Nothing -> return never
356 Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
356 Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
357 TextArea.setValue domTextAreaElement $ Just v'
357 TextArea.setValue domTextAreaElement $ Just v'
@@ -376,9 +376,11 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
376 Just v0 <- Select.getValue domSelectElement
376 Just v0 <- Select.getValue domSelectElement
377 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
377 let getMyValue = fromMaybe "" <$> Select.getValue domSelectElement
378 valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
378 valueChangedByUI <- performEvent $ getMyValue <$ Reflex.select (_element_events e) (WrapArg Change)
379− valueChangedBySetValue <- performEvent $ ffor (cfg ^. selectElementConfig_setValue) $ \v' -> do
379+ valueChangedBySetValue <- case _selectElementConfig_setValue cfg of
380+ Nothing -> return never
381+ Just eSetValue -> performEvent $ ffor eSetValue $ \v' -> do
380− Select.setValue domSelectElement $ Just v'
382+ Select.setValue domSelectElement $ Just v'
381− getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
383+ getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
382 v <- holdDyn v0 $ leftmost
384 v <- holdDyn v0 $ leftmost
383 [ valueChangedBySetValue
385 [ valueChangedBySetValue
384 , valueChangedByUI
386 , valueChangedByUI