| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| /// A range of indexes within a list. | |
| class IndexRange { | |
| /// The index of the first element in the range. | |
| final int lower; | |
| /// The index of the last element in the range. This will be the same as the | |
| /// [lower] if there is a single element in the range. | |
| final int upper; | |
| /// Initialize a newly created range. | |
| new(this.lower, this.upper); | |
| /// Return the number of indices in this range. | |
| int get count => upper - lower + 1; | |
| @override | |
| String toString() => '[$lower..$upper]'; | |
| static List<IndexRange> contiguousSubRanges(List<int> indexes) { | |
| var ranges = <IndexRange>[]; | |
| if (indexes.isEmpty) { | |
| return ranges; | |
| } | |
| var lower = indexes[0]; | |
| var previous = lower; | |
| for (var index = 1; index < indexes.length; index++) { | |
| var current = indexes[index]; | |
| if (current == previous + 1) { | |
| previous = current; | |
| } else { | |
| ranges.add(IndexRange(lower, previous)); | |
| lower = previous = current; | |
| } | |
| } | |
| ranges.add(IndexRange(lower, previous)); | |
| return ranges; | |
| } | |
| } |