on develop help sign in
Improve efficiency of setCheck events in inputElement for ImmediateDomBuilderT
b07e026Daniel Haraj
src/Reflex/Dom/Builder/Class.hs+16−6
@@ -221,7 +221,7 @@ data InputElementConfig er t m
221 = InputElementConfig { _inputElementConfig_initialValue :: Text
221 = InputElementConfig { _inputElementConfig_initialValue :: Text
222 , _inputElementConfig_setValue :: Maybe (Event t Text)
222 , _inputElementConfig_setValue :: Maybe (Event t Text)
223 , _inputElementConfig_initialChecked :: Bool
223 , _inputElementConfig_initialChecked :: Bool
224− , _inputElementConfig_setChecked :: Event t Bool
224+ , _inputElementConfig_setChecked :: Maybe (Event t Bool)
225 , _inputElementConfig_elementConfig :: ElementConfig er t m
225 , _inputElementConfig_elementConfig :: ElementConfig er t m
226 }
226 }
227
227
@@ -231,7 +231,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (InputElementCo
231 { _inputElementConfig_initialValue = ""
231 { _inputElementConfig_initialValue = ""
232 , _inputElementConfig_setValue = Nothing
232 , _inputElementConfig_setValue = Nothing
233 , _inputElementConfig_initialChecked = False
233 , _inputElementConfig_initialChecked = False
234− , _inputElementConfig_setChecked = never
234+ , _inputElementConfig_setChecked = Nothing
235 , _inputElementConfig_elementConfig = def
235 , _inputElementConfig_elementConfig = def
236 }
236 }
237
237
@@ -307,10 +307,11 @@ data SelectElement er d t = SelectElement
307 }
307 }
308
308
309concat <$> mapM (uncurry makeLensesWithoutField)
309concat <$> mapM (uncurry makeLensesWithoutField)
310− [ ("_textNodeConfig_setContents", ''TextNodeConfig)
310+ [ (["_textNodeConfig_setContents"], ''TextNodeConfig)
311− , ("_inputElementConfig_setValue", ''InputElementConfig)
311+ , ([ "_inputElementConfig_setValue"
312+ , "_inputElementConfig_setChecked" ], ''InputElementConfig)
312− , ("_rawElementConfig_modifyAttributes", ''RawElementConfig)
313+ , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
313− , ("_elementConfig_modifyAttributes", ''ElementConfig)
314+ , (["_elementConfig_modifyAttributes"], ''ElementConfig)
314 ]
315 ]
315
316
316-- | 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'.
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'.
@@ -331,6 +332,15 @@ inputElementConfig_setValue =
331 setter t e = t { _inputElementConfig_setValue = Just e }
332 setter t e = t { _inputElementConfig_setValue = Just e }
332 in lens getter setter
333 in lens getter setter
333
334
335+-- | 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'.
336+inputElementConfig_setChecked :: Reflex t => Lens (InputElementConfig er t m) (InputElementConfig er t m) (Event t Bool) (Event t Bool)
337+inputElementConfig_setChecked =
338+ let getter t = case _inputElementConfig_setChecked t of
339+ Nothing -> never
340+ Just e -> e
341+ setter t e = t { _inputElementConfig_setChecked = Just e }
342+ in lens getter setter
343+
334-- | 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'.
344-- | 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'.
335rawElementConfig_modifyAttributes :: Reflex t => Lens (RawElementConfig er t m) (RawElementConfig er t m) (Event t (Map AttributeName (Maybe Text))) (Event t (Map AttributeName (Maybe Text)))
345rawElementConfig_modifyAttributes :: Reflex t => Lens (RawElementConfig er t m) (RawElementConfig er t m) (Event t (Map AttributeName (Maybe Text))) (Event t (Map AttributeName (Maybe Text)))
336rawElementConfig_modifyAttributes =
346rawElementConfig_modifyAttributes =
src/Reflex/Dom/Builder/Class/TH.hs+3−3
@@ -4,9 +4,9 @@ import Control.Lens
4import Language.Haskell.TH.Syntax (Name, nameBase)
4import Language.Haskell.TH.Syntax (Name, nameBase)
5import Language.Haskell.TH.Lib (DecsQ)
5import Language.Haskell.TH.Lib (DecsQ)
6
6
7−namer :: String -> Name -> [Name] -> Name -> [DefName]
7+namer :: [String] -> Name -> [Name] -> Name -> [DefName]
8−namer s n ks t | s == nameBase t = []
8+namer s n ks t | nameBase t `elem` s = []
9 | otherwise = underscoreNoPrefixNamer n ks t
9 | otherwise = underscoreNoPrefixNamer n ks t
10
10
11−makeLensesWithoutField :: String -> Name -> DecsQ
11+makeLensesWithoutField :: [String] -> Name -> DecsQ
12makeLensesWithoutField s = makeLensesWith (lensRules & lensField .~ namer s)
12makeLensesWithoutField s = makeLensesWith (lensRules & lensField .~ namer s)
src/Reflex/Dom/Builder/Immediate.hs+8−6
@@ -312,12 +312,14 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
312 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
312 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
313 checkedChangedByUI <- wrapDomEvent domInputElement (`on` Element.click) $ do
313 checkedChangedByUI <- wrapDomEvent domInputElement (`on` Element.click) $ do
314 Input.getChecked domInputElement
314 Input.getChecked domInputElement
315− checkedChangedBySetChecked <- performEvent $ ffor (_inputElementConfig_setChecked cfg) $ \newChecked -> do
315+ checkedChangedBySetChecked <- case (_inputElementConfig_setChecked cfg) of
316+ Nothing -> return never
317+ Just eNewchecked -> performEvent $ ffor eNewchecked $ \newChecked -> do
316− oldChecked <- Input.getChecked domInputElement
318+ oldChecked <- Input.getChecked domInputElement
317− if newChecked /= oldChecked
319+ if newChecked /= oldChecked
318− then do Input.setChecked domInputElement newChecked
320+ then do Input.setChecked domInputElement newChecked
319− return $ Just newChecked
321+ return $ Just newChecked
320− else return Nothing
322+ else return Nothing
321 c <- holdDyn (_inputElementConfig_initialChecked cfg) $ leftmost
323 c <- holdDyn (_inputElementConfig_initialChecked cfg) $ leftmost
322 [ fmapMaybe id checkedChangedBySetChecked
324 [ fmapMaybe id checkedChangedBySetChecked
323 , checkedChangedByUI
325 , checkedChangedByUI