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					
