runLengthEncode method

  1. @useResult
List<(T, int)> runLengthEncode()

Run-length encodes this iterable into (value, count) pairs.

Example:

[1, 1, 2, 2, 2].runLengthEncode(); // [(1, 2), (2, 3)]

Implementation

@useResult
List<(T, int)> runLengthEncode() {
  final List<(T, int)> result = <(T, int)>[];
  T? prev;
  int count = 0;
  for (final T element in this) {
    if (prev == null || element != prev) {
      if (prev != null) result.add((prev, count));
      prev = element;
      count = 1;
    } else {
      count++;
    }
  }
  if (prev != null) result.add((prev, count));
  return result;
}