range function

Iterable<int> range(
  1. int a, [
  2. int? b,
  3. int? step
])

Generates a List of integers. range(n) is always in ascending order, doesn't include n itself. range(3) returns (0, 1, 2). range(-3) returns (-2, -1, 0). range(0) returns ().

With two arguments, result doesn't include the second: range(1, 3) returns (1, 2). range(-3, -1) returns (-3, -2). range(0, -3) returns (0, -1, -2). range(1, 1) returns ().

Optional step must be positive if a < b, negative if a > b. range(1, 3, 2) returns (1). range(-2, 2, 2) returns (-2, 0). range(-3, -7, -2) returns (-3, -5).

Implementation

Iterable<int> range(int a, [int? b, int? step]) sync* {
  if (b == null) {
    if (a >= 0) {
      for (int i = 0; i < a; i++) {
        yield i;
      }
    } else {
      for (int i = a + 1; i <= 0; i++) {
        yield i;
      }
    }
    return;
  }

  if (a < b) {
    if (step != null && step <= 0) {
      throw ArgumentError('step must be positive if beginning < end');
    }
    for (int i = a; i < b; i += step ?? 1) {
      yield i;
    }
  } else if (a > b) {
    if (step != null && step >= 0) {
      throw ArgumentError('step must be negative if beginning > end');
    }
    for (int i = a; i > b; i += step ?? -1) {
      yield i;
    }
  }
}