on develop help sign in
Improve efficiency of setCheck events in inputElement for ImmediateDomBuilderT
commitb07e0261403000f55bce2cc360d42147cb888905 authorDaniel Haraj <dan@obsidian.systems> dateSat 28 Jan 2017, 20:26 (10 years ago) parentd18565b
3 files changed+27−15
src/Reflex/Dom/Builder/Class.hs+16−6 src/Reflex/Dom/Builder/Class/TH.hs+3−3 src/Reflex/Dom/Builder/Immediate.hs+8−6
src/Reflex/Dom/Builder/Class.hs+16−6
@@ -221,7 +221,7 @@ data InputElementConfig er t m
221221 = InputElementConfig { _inputElementConfig_initialValue :: Text
222222 , _inputElementConfig_setValue :: Maybe (Event t Text)
223223 , _inputElementConfig_initialChecked :: Bool
224− , _inputElementConfig_setChecked :: Event t Bool
224+ , _inputElementConfig_setChecked :: Maybe (Event t Bool)
225225 , _inputElementConfig_elementConfig :: ElementConfig er t m
226226 }
227227
@@ -231,7 +231,7 @@ instance (Reflex t, er ~ EventResult, DomBuilder t m) => Default (InputElementCo
231231 { _inputElementConfig_initialValue = ""
232232 , _inputElementConfig_setValue = Nothing
233233 , _inputElementConfig_initialChecked = False
234− , _inputElementConfig_setChecked = never
234+ , _inputElementConfig_setChecked = Nothing
235235 , _inputElementConfig_elementConfig = def
236236 }
237237
@@ -307,10 +307,11 @@ data SelectElement er d t = SelectElement
307307 }
308308
309309concat <$> mapM (uncurry makeLensesWithoutField)
310− [ ("_textNodeConfig_setContents", ''TextNodeConfig)
311− , ("_inputElementConfig_setValue", ''InputElementConfig)
312− , ("_rawElementConfig_modifyAttributes", ''RawElementConfig)
313− , ("_elementConfig_modifyAttributes", ''ElementConfig)
310+ [ (["_textNodeConfig_setContents"], ''TextNodeConfig)
311+ , ([ "_inputElementConfig_setValue"
312+ , "_inputElementConfig_setChecked" ], ''InputElementConfig)
313+ , (["_rawElementConfig_modifyAttributes"], ''RawElementConfig)
314+ , (["_elementConfig_modifyAttributes"], ''ElementConfig)
314315 ]
315316
316317-- | 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 =
331332 setter t e = t { _inputElementConfig_setValue = Just e }
332333 in lens getter setter
333334
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+
334344-- | 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'.
335345rawElementConfig_modifyAttributes :: Reflex t => Lens (RawElementConfig er t m) (RawElementConfig er t m) (Event t (Map AttributeName (Maybe Text))) (Event t (Map AttributeName (Maybe Text)))
336346rawElementConfig_modifyAttributes =
src/Reflex/Dom/Builder/Class/TH.hs+3−3
@@ -4,9 +4,9 @@ import Control.Lens
44import Language.Haskell.TH.Syntax (Name, nameBase)
55import Language.Haskell.TH.Lib (DecsQ)
66
7−namer :: String -> Name -> [Name] -> Name -> [DefName]
8−namer s n ks t | s == nameBase t = []
7+namer :: [String] -> Name -> [Name] -> Name -> [DefName]
8+namer s n ks t | nameBase t `elem` s = []
99 | otherwise = underscoreNoPrefixNamer n ks t
1010
11−makeLensesWithoutField :: String -> Name -> DecsQ
11+makeLensesWithoutField :: [String] -> Name -> DecsQ
1212makeLensesWithoutField 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
312312 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
313313 checkedChangedByUI <- wrapDomEvent domInputElement (`on` Element.click) $ do
314314 Input.getChecked domInputElement
315− checkedChangedBySetChecked <- performEvent $ ffor (_inputElementConfig_setChecked cfg) $ \newChecked -> do
316− oldChecked <- Input.getChecked domInputElement
317− if newChecked /= oldChecked
318− then do Input.setChecked domInputElement newChecked
319− return $ Just newChecked
320− else return Nothing
315+ checkedChangedBySetChecked <- case (_inputElementConfig_setChecked cfg) of
316+ Nothing -> return never
317+ Just eNewchecked -> performEvent $ ffor eNewchecked $ \newChecked -> do
318+ oldChecked <- Input.getChecked domInputElement
319+ if newChecked /= oldChecked
320+ then do Input.setChecked domInputElement newChecked
321+ return $ Just newChecked
322+ else return Nothing
321323 c <- holdDyn (_inputElementConfig_initialChecked cfg) $ leftmost
322324 [ fmapMaybe id checkedChangedBySetChecked
323325 , checkedChangedByUI