@@ -268,25 +268,33 @@ double calculateUnclaimedTokenPercentage(
268268/// Returns the number of tokens in the longest unclaimed token
269269/// sequence.
270270int findLongestUnclaimedTokenRange (List <LicenseMatch > matches, int end) {
271- var ranges = < Range > [];
272271 if (matches.isEmpty) return end;
273272
274- for (var match in matches) {
275- ranges.add (Range (match.tokenRange.start, match.tokenRange.end));
276- }
277-
278- ranges.sort (sortRangeOnStartValue);
279- var maxTokenSequence = ranges.first.start - 0 ;
273+ var maxUnclaimed = 0 ;
274+
275+ // create an end-of-range marker at the end of ranges for easier computation
276+ final ranges = [...matches.map ((m) => m.tokenRange), Range (end, end)];
277+
278+ // move position from the start up to the end, checking uncovered ranges
279+ for (var pos = 0 ; pos < end;) {
280+ // check if inside a range
281+ final skipToEnd = ranges
282+ .where ((r) => r.containsIndex (pos))
283+ .map ((r) => r.end)
284+ .fold (- 1 , max);
285+ if (skipToEnd > - 1 ) {
286+ assert (pos < skipToEnd);
287+ pos = skipToEnd;
288+ continue ;
289+ }
280290
281- for (var i = 1 ; i < ranges.length; i++ ) {
282- maxTokenSequence = max (
283- ranges[i].start - ranges[i - 1 ].end,
284- maxTokenSequence,
285- );
291+ // jump to next range
292+ final nextRange = ranges
293+ .where ((r) => r.start > pos)
294+ .reduce ((a, b) => a.start.compareTo (b.start) <= 0 ? a : b);
295+ maxUnclaimed = max (maxUnclaimed, nextRange.start - pos);
296+ pos = nextRange.end;
286297 }
287298
288- maxTokenSequence = max (maxTokenSequence, end - ranges.last.end);
289- return maxTokenSequence;
299+ return maxUnclaimed;
290300}
291-
292- int sortRangeOnStartValue (Range a, Range b) => a.start - b.start;
0 commit comments