id,summary,reporter,owner,description,type,status,priority,milestone,component,version,resolution,keywords,cc,os,architecture,failure,difficulty,testcase,blockedby,blocking,related
4109,Make Data.Map.insertWith' and friends consistently force the value inserted,igloo,igloo,"Currently, `Data.Map.insertWith'` (and friends) only force the value inserted when the combining function creates it:
{{{
Prelude Data.Map> insertWith' (+) ""foo"" undefined empty `seq` ()
()
Prelude Data.Map> insertWith' (+) ""foo"" undefined (singleton ""foo"" 1) `seq` ()
*** Exception: Prelude.undefined
}}}
I think it would be more consistent for it to always force it:
{{{
Prelude Data.Map> insertWith' (+) ""foo"" undefined empty `seq` ()
*** Exception: Prelude.undefined
Prelude Data.Map> insertWith' (+) ""foo"" undefined (singleton ""foo"" 1) `seq` ()
*** Exception: Prelude.undefined
}}}

Patch:
{{{
hunk ./Data/Map.hs 460
 insertWithKey' :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a
 insertWithKey' f kx x t
   = case t of
-      Tip -> singleton kx x
+      Tip -> singleton kx $! x
       Bin sy ky y l r
           -> case compare kx ky of
                LT -> balance ky y (insertWithKey' f kx x l) r
}}}

Suggested discussion deadline: 14 June 2010.
",proposal,closed,normal,Not GHC,libraries (other),6.12.2,fixed,,,Unknown/Multiple,Unknown/Multiple,None/Unknown,,,,,
