range function
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;
}
}
}