slices method Null safety

Stream<List<T>> slices(
  1. int length
)

Creates a stream whose elements are contiguous slices of this.

Each slice is length elements long, except for the last one which may be shorter if this emits too few elements. Each slice begins after the last one ends.

For example, Stream.fromIterable([1, 2, 3, 4, 5]).slices(2) emits ([1, 2], [3, 4], [5]).

Errors are forwarded to the result stream immediately when they occur, even if previous data events have not been emitted because the next slice is not complete yet.

Implementation

Stream<List<T>> slices(int length) {
  if (length < 1) throw RangeError.range(length, 1, null, 'length');

  var slice = <T>[];
  return transform(StreamTransformer.fromHandlers(handleData: (data, sink) {
    slice.add(data);
    if (slice.length == length) {
      sink.add(slice);
      slice = [];
    }
  }, handleDone: (sink) {
    if (slice.isNotEmpty) sink.add(slice);
    sink.close();
  }));
}