You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
53 lines
1.3 KiB
//TODO: move this code to span model |
|
|
|
import * as _ from 'lodash'; |
|
|
|
export declare type Span = { |
|
from: number, |
|
to: number |
|
} |
|
|
|
export function getNonIntersectedSpans(from: number, to: number, spanBorders: number[]): Span[] { |
|
// spanBorders array must be sorted ascending |
|
let isFromProcessed = false; |
|
let alreadyDetected = false; |
|
let startDetectionRange = null; |
|
let result: Span[] = []; |
|
|
|
for(var border of spanBorders) { |
|
if(!isFromProcessed && border >= from) { |
|
isFromProcessed = true; |
|
if(border === from) { |
|
if(alreadyDetected) { |
|
startDetectionRange = from; |
|
} |
|
} else { |
|
if(!alreadyDetected) { |
|
startDetectionRange = from; |
|
} |
|
} |
|
} |
|
|
|
if(border >= to) { |
|
if(!alreadyDetected) { |
|
result.push({ from: startDetectionRange, to }); |
|
} |
|
break; |
|
} |
|
|
|
if(alreadyDetected) { //end of already detected region, start point for new detection |
|
startDetectionRange = border; |
|
} else { //end of new detection region |
|
if(startDetectionRange !== null) { |
|
result.push({ from: startDetectionRange, to: border}); |
|
} |
|
} |
|
alreadyDetected = !alreadyDetected; |
|
} |
|
|
|
if(border < to) { |
|
result.push({ from: startDetectionRange, to }); |
|
} |
|
|
|
return result; |
|
}
|
|
|