- Adds memoization to the grouping algorithm. This is a significant performance increase in some situations. (#5)
- Eliminates certain logical paths that will never succeed given what we've already calculated. This increases performance across the board for any grouping that requires backtracking. (#6)
- Causes constraint validation failures to raise an
ArgumentError
rather than returning an error tuple. (#7)