Thursday, May 3, 2012

New major release of the containers package

I'm proud to announce a new major release of the containers package. There has been a whopping 160 commits since the last release. The major improvements are:

  • a clearer distinction between value-lazy and value-strict containers,
  • performance improvements across the board,
  • a big internal clean-up, and
  • new functions for e.g. merging, updating, and searching containers.

The first item is perhaps the most visible. While the old Data.Map and Data.IntMap modules will continue to exist for the foreseeable future, we've abandoned the practice of having the strict and lazy versions of each function distinguished by an apostrophe. The distinction is instead made at the module level, by introducing four new modules:

  • Data.Map.Strict
  • Data.Map.Lazy
  • Data.IntMap.Strict
  • Data.IntMap.Lazy

This split has three benefits:

  • It makes the choice between value-strict and value-lazy containers more declarative; you pick once at import time, instead of having to remember to use the strict or lazy versions of a function every time you modify the container.
  • It alleviates a common source of performance issues, by forcing the user to think about the strictness properties upfront. For example, using insertWith instead of insertWith' is a common source of containers-related performance bugs.
  • There are fewer functions per module, making it easier to get an overview of each module.

Note that the types used in the strict and lazy APIs are the same, so you can still use the same container in a "mixed" manner, if needed.

Contributors to this release:

  • Milan Straka
  • Johan Tibell
  • Joachim Breitner
  • Edward Z. Yang
  • Herbert Valerio Riedel
  • Matt West
  • Max Bolingbroke