regenerate method

void regenerate({
  1. required int newLength,
  2. required T generate(
    1. int
    ),
  3. void onRemove(
    1. T
    )?,
})

Regenerates a set to have provided newLength.

If current length is greater than newLength it will remove last ones to match new length. Removed elements can be handled by onRemove. If current length is lower than newLength we generate new ones to match new length.

If length matches current, does nothing.

Implementation

void regenerate({
  required int newLength,
  required T Function(int) generate,
  void Function(T)? onRemove,
}) {
  assert(newLength >= 0, "new length can't be lower than 0");

  final diff = length - newLength;

  if (diff == 0) return;

  if (diff > 0) {
    while (length > newLength) {
      final removedElement = first;
      remove(removedElement);
      onRemove?.call(removedElement);
    }
  } else {
    for (var i = 0; i > diff; i--) {
      add(generate(length - i));
    }
  }
}