Fix Foldable instance for IntMap (fixes #579) (#593)
authorMatt Renaud <matt@m-renaud.com>
Tue, 22 Jan 2019 03:41:53 +0000 (19:41 -0800)
committerGitHub <noreply@github.com>
Tue, 22 Jan 2019 03:41:53 +0000 (19:41 -0800)
commit4bd9f7ad7d0cf2f3886d379214b364195db2d34a
tree88daf8e736b9eaf16bb912ec6cc6fad84c1a81ea
parent3a343a3f6353bc60c8766dfd564646210f2b06bd
Fix Foldable instance for IntMap (fixes #579) (#593)

* Fix Foldable instance for IntMap.

As reported in https://github.com/haskell/containers/issues/579 the Foldable
instance for IntMap is unlawful and internally inconsistent. This was caused as
a result of the internal representation used by IntMap.

More specifically, `fold`, `foldMap`, and `traverse` (via `traverseWithKey`)
always placed positively keyed entries before negative keyed ones. To fix this
we need to check to see if the mask is positive or negative.

Tested by adding new property tests, verifying they failed with the
implementation at HEAD, and then passed after the changes.
Data/IntMap/Internal.hs
changelog.md
tests/intmap-properties.hs