group<A> function

List<NonEmptyList<A>> Function(NonEmptyList<A>) group<A>(
  1. Eq<A> eq
)

Groups consecutive similar items based on the equality eq.

var eq = Eq<int>((a, b) => a == b);
var nel = NonEmptyList([1, 1, 2, 2, 3]);
var groups = group(eq)(nel);
print(groups.map((g) => g.items).toList());  // [[1, 1], [2, 2], [3]]

Implementation

List<NonEmptyList<A>> Function(NonEmptyList<A>) group<A>(Eq<A> eq) =>
    (NonEmptyList<A> list) {
      List<NonEmptyList<A>> result = [];
      List<A> currentGroup = [list._items.first];
      list._items.skip(1).forEach((item) {
        if (eq.equals(item, currentGroup.last)) {
          currentGroup.add(item);
        } else {
          result.add(NonEmptyList(currentGroup));
          currentGroup = [item];
        }
      });
      result.add(NonEmptyList(currentGroup));
      return result;
    };