@teselagen/range-utils 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -0
- package/flipContainedRange.d.ts +1 -1
- package/index.js +233 -85
- package/index.mjs +233 -85
- package/index.umd.js +233 -85
- package/package.json +1 -2
- package/src/adjustRangeToDeletionOfAnotherRange.test.js +166 -105
- package/src/adjustRangeToInsert.js +29 -26
- package/src/adjustRangeToInsert.test.js +197 -109
- package/src/adjustRangeToRotation.js +4 -5
- package/src/adjustRangeToRotation.test.js +203 -119
- package/src/checkIfNonCircularRangesOverlap.js +18 -15
- package/src/checkIfNonCircularRangesOverlap.test.js +67 -42
- package/src/checkIfPotentiallyCircularRangesOverlap.js +22 -12
- package/src/checkIfPotentiallyCircularRangesOverlap.test.js +115 -70
- package/src/collapseOverlapsGeneratedFromRangeComparisonIfPossible.js +72 -41
- package/src/collapseOverlapsGeneratedFromRangeComparisonIfPossible.test.js +183 -84
- package/src/convertRangeIndices.js +24 -20
- package/src/convertRangeIndices.test.js +40 -21
- package/src/convertRangeTo0Based.js +7 -4
- package/src/convertRangeTo1Based.js +8 -4
- package/src/doesRangeSpanEntireSequence.js +4 -4
- package/src/doesRangeSpanOrigin.js +3 -3
- package/src/expandOrContractCircularRangeToPosition.js +45 -38
- package/src/expandOrContractNonCircularRangeToPosition.js +24 -21
- package/src/expandOrContractRangeByLength.js +16 -11
- package/src/expandOrContractRangeByLength.test.js +109 -71
- package/src/expandOrContractRangeToPosition.js +17 -9
- package/src/flipContainedRange.js +133 -72
- package/src/flipContainedRange.test.js +143 -117
- package/src/generateRandomRange.js +17 -15
- package/src/generateRandomRange.test.js +21 -21
- package/src/getAnnotationRangeType.js +25 -21
- package/src/getAnnotationRangeType.test.js +56 -57
- package/src/getEachPositionInRangeAsArray.js +13 -13
- package/src/getEachPositionInRangeAsArray.test.js +12 -8
- package/src/getLengthOfOverlappingRegionsBetweenTwoRanges.js +16 -8
- package/src/getLengthOfOverlappingRegionsBetweenTwoRanges.test.js +32 -24
- package/src/getMiddleOfRange.js +1 -1
- package/src/getMiddleOfRange.test.js +5 -13
- package/src/getOverlapOfNonCircularRanges.js +30 -30
- package/src/getOverlapsOfPotentiallyCircularRanges.js +5 -5
- package/src/getOverlapsOfPotentiallyCircularRanges.test.js +3 -23
- package/src/getPositionFromAngle.js +12 -7
- package/src/getRangeAngles.js +1 -1
- package/src/getRangeAngles.test.js +10 -11
- package/src/getRangeLength.test.js +5 -5
- package/src/getRangesBetweenTwoRanges.js +31 -22
- package/src/getSequenceWithinRange.js +13 -13
- package/src/getSequenceWithinRange.test.js +43 -45
- package/src/getShortestDistanceBetweenTwoPositions.js +10 -6
- package/src/getShortestDistanceBetweenTwoPositions.test.js +11 -13
- package/src/getYOffsetForPotentiallyCircularRange.js +33 -21
- package/src/getYOffsetsForPotentiallyCircularRanges.js +26 -19
- package/src/getYOffsetsForPotentiallyCircularRanges.test.js +42 -29
- package/src/getZeroedRangeOverlaps.js +30 -15
- package/src/getZeroedRangeOverlaps.test.js +75 -36
- package/src/index.js +51 -51
- package/src/index.test.js +6 -8
- package/src/invertRange.test.js +103 -93
- package/src/isPositionCloserToRangeStartThanRangeEnd.js +18 -6
- package/src/isPositionCloserToRangeStartThanRangeEnd.test.js +36 -16
- package/src/isPositionWithinRange.js +4 -4
- package/src/isRangeOrPositionWithinRange.js +18 -12
- package/src/isRangeOrPositionWithinRange.test.js +6 -6
- package/src/isRangeWithinRange.js +2 -3
- package/src/loopEachPositionInRange.js +3 -3
- package/src/modulatePositionByRange.js +8 -8
- package/src/modulatePositionByRange.test.js +10 -11
- package/src/modulateRangeBySequenceLength.js +7 -7
- package/src/modulateRangeBySequenceLength.test.js +39 -16
- package/src/normalizePositionByRangeLength.js +22 -18
- package/src/normalizePositionByRangeLength.test.js +23 -23
- package/src/normalizePositionByRangeLength1Based.js +7 -4
- package/src/normalizePositionByRangeLength1Based.test.js +9 -9
- package/src/normalizeRange.js +7 -7
- package/src/normalizeRange.test.js +9 -9
- package/src/provideInclusiveOptions.js +36 -23
- package/src/reversePositionInRange.js +16 -12
- package/src/splitRangeIntoTwoPartsIfItIsCircular.js +31 -28
- package/src/splitRangeIntoTwoPartsIfItIsCircular.test.js +22 -11
- package/src/translateRange.js +18 -8
- package/src/translateRange.test.js +18 -19
- package/src/trimNonCicularRangeByAnotherNonCircularRange.js +45 -42
- package/src/trimNumberToFitWithin0ToAnotherNumber.js +13 -10
- package/src/trimRangeByAnotherRange.js +20 -19
- package/src/trimRangeByAnotherRange.test.js +6 -6
- package/src/zeroSubrangeByContainerRange.js +29 -19
- package/src/zeroSubrangeByContainerRange.test.js +57 -47
package/README.md
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
<!-- TOC -->
|
2
|
+
|
3
|
+
- [[CHANGELOG](Changelog.md)](#changelogchangelogmd)
|
4
|
+
- [Installing](#installing)
|
5
|
+
- [Usage](#usage)
|
6
|
+
- [About this Repo](#about-this-repo)
|
7
|
+
- [Editing This Repo:](#editing-this-repo)
|
8
|
+
- [All collaborators:](#all-collaborators)
|
9
|
+
- [Updating this repo:](#updating-this-repo)
|
10
|
+
- [Teselagen collaborators:](#teselagen-collaborators)
|
11
|
+
- [Outside collaborators:](#outside-collaborators)
|
12
|
+
- [Building](#building)
|
13
|
+
- [Running unit tests](#running-unit-tests)
|
14
|
+
|
15
|
+
<!-- /TOC -->
|
16
|
+
|
17
|
+
## [CHANGELOG](Changelog.md)
|
18
|
+
|
19
|
+
## Installing
|
20
|
+
|
21
|
+
```
|
22
|
+
npm install @teselagen/range-utils
|
23
|
+
```
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
```
|
28
|
+
import { getRangeLength } from '@teselagen/range-utils';
|
29
|
+
```
|
30
|
+
|
31
|
+
## About this Repo
|
32
|
+
|
33
|
+
This is a collection of range utility functions.
|
34
|
+
|
35
|
+
A range must be an object with a start and end property.
|
36
|
+
Eg:
|
37
|
+
|
38
|
+
```
|
39
|
+
const myRange = {
|
40
|
+
start: 10,
|
41
|
+
end: 40
|
42
|
+
}
|
43
|
+
```
|
44
|
+
|
45
|
+
A "circular" range has a start > end.
|
46
|
+
Eg:
|
47
|
+
|
48
|
+
```
|
49
|
+
const myRange2 = {
|
50
|
+
start: 50,
|
51
|
+
end: 40
|
52
|
+
}
|
53
|
+
```
|
54
|
+
|
55
|
+
All ranges are assumed to have 0-based inclusive indices:
|
56
|
+
|
57
|
+
rrrr
|
58
|
+
0123
|
59
|
+
start = 0,
|
60
|
+
end = 3
|
61
|
+
|
62
|
+
## Editing This Repo:
|
63
|
+
|
64
|
+
### All collaborators:
|
65
|
+
|
66
|
+
Edit/create a new file and update/add any relevant tests.
|
67
|
+
You can run `npm test` to make sure all tests pass.
|
68
|
+
Tests will automatically be run pre-commit.
|
69
|
+
|
70
|
+
## Updating this repo:
|
71
|
+
|
72
|
+
### Teselagen collaborators:
|
73
|
+
|
74
|
+
Commit and push all changes
|
75
|
+
Sign into npm using the teselagen npm account (npm whoami)
|
76
|
+
|
77
|
+
```
|
78
|
+
npm version patch|minor|major
|
79
|
+
npm publish
|
80
|
+
```
|
81
|
+
|
82
|
+
### Outside collaborators:
|
83
|
+
|
84
|
+
fork and pull request please :)
|
85
|
+
|
86
|
+
This library was generated with [Nx](https://nx.dev).
|
87
|
+
|
88
|
+
## Building
|
89
|
+
|
90
|
+
Run `nx build range-utils` to build the library.
|
91
|
+
|
92
|
+
## Running unit tests
|
93
|
+
|
94
|
+
Run `nx test range-utils` to execute the unit tests via [Jest](https://jestjs.io).
|
package/flipContainedRange.d.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export default function flipRelativeRange(innerRange: any, outerRange: any, sequenceLength: any
|
1
|
+
export default function flipRelativeRange(innerRange: any, outerRange: any, sequenceLength: any): any;
|
package/index.js
CHANGED
@@ -6047,8 +6047,8 @@ function getOverlapsOfPotentiallyCircularRanges(rangeA, rangeB, maxRangeLength,
|
|
6047
6047
|
maxRangeLength
|
6048
6048
|
);
|
6049
6049
|
let overlaps = [];
|
6050
|
-
normalizedRangeA.forEach(function(nonCircularRangeA
|
6051
|
-
normalizedRangeB.forEach(function(nonCircularRangeB
|
6050
|
+
normalizedRangeA.forEach(function(nonCircularRangeA) {
|
6051
|
+
normalizedRangeB.forEach(function(nonCircularRangeB) {
|
6052
6052
|
const overlap = getOverlapOfNonCircularRanges(
|
6053
6053
|
nonCircularRangeA,
|
6054
6054
|
nonCircularRangeB
|
@@ -6060,7 +6060,7 @@ function getOverlapsOfPotentiallyCircularRanges(rangeA, rangeB, maxRangeLength,
|
|
6060
6060
|
});
|
6061
6061
|
if (joinIfPossible && normalizedRangeA.length === 2 && normalizedRangeB.length === 2 && maxRangeLength) {
|
6062
6062
|
const joinedOverlap = {};
|
6063
|
-
overlaps = lodashExports.flatMap(overlaps, (o
|
6063
|
+
overlaps = lodashExports.flatMap(overlaps, (o) => {
|
6064
6064
|
if (o.start === 0) {
|
6065
6065
|
joinedOverlap.end = o.end;
|
6066
6066
|
return [];
|
@@ -6158,12 +6158,14 @@ function trimRangeByAnotherRange(rangeToBeTrimmed, trimmingRange, sequenceLength
|
|
6158
6158
|
});
|
6159
6159
|
splitRangesToBeTrimmed[index] = nonCircularRangeToBeTrimmed;
|
6160
6160
|
});
|
6161
|
-
const outputSplitRanges = splitRangesToBeTrimmed.filter(
|
6162
|
-
|
6163
|
-
|
6161
|
+
const outputSplitRanges = splitRangesToBeTrimmed.filter(
|
6162
|
+
function(trimmedRange) {
|
6163
|
+
if (trimmedRange) {
|
6164
|
+
return true;
|
6165
|
+
}
|
6166
|
+
return false;
|
6164
6167
|
}
|
6165
|
-
|
6166
|
-
});
|
6168
|
+
);
|
6167
6169
|
let outputTrimmedRange;
|
6168
6170
|
if (outputSplitRanges.length < 0)
|
6169
6171
|
;
|
@@ -6262,11 +6264,19 @@ function checkIfNonCircularRangesOverlap(range, comparisonRange) {
|
|
6262
6264
|
}
|
6263
6265
|
__name(checkIfNonCircularRangesOverlap, "checkIfNonCircularRangesOverlap");
|
6264
6266
|
function checkIfPotentiallyCircularRangesOverlap(range, comparisonRange) {
|
6265
|
-
return splitRangeIntoTwoPartsIfItIsCircular(range, Infinity).some(
|
6266
|
-
|
6267
|
-
return
|
6268
|
-
|
6269
|
-
|
6267
|
+
return splitRangeIntoTwoPartsIfItIsCircular(range, Infinity).some(
|
6268
|
+
function(splitRange) {
|
6269
|
+
return splitRangeIntoTwoPartsIfItIsCircular(
|
6270
|
+
comparisonRange,
|
6271
|
+
Infinity
|
6272
|
+
).some(function(splitComparisonRange) {
|
6273
|
+
return checkIfNonCircularRangesOverlap(
|
6274
|
+
splitRange,
|
6275
|
+
splitComparisonRange
|
6276
|
+
);
|
6277
|
+
});
|
6278
|
+
}
|
6279
|
+
);
|
6270
6280
|
}
|
6271
6281
|
__name(checkIfPotentiallyCircularRangesOverlap, "checkIfPotentiallyCircularRangesOverlap");
|
6272
6282
|
function collapseOverlapsGeneratedFromRangeComparisonIfPossible(overlaps, sequenceLength, optionalOriginalRange) {
|
@@ -6275,15 +6285,19 @@ function collapseOverlapsGeneratedFromRangeComparisonIfPossible(overlaps, sequen
|
|
6275
6285
|
return overlaps;
|
6276
6286
|
} else if (overlaps.length === 2) {
|
6277
6287
|
if (overlaps[0].start === 0 && overlaps[1].end + 1 === sequenceLength && !originalRangeLinear) {
|
6278
|
-
return [
|
6279
|
-
|
6280
|
-
|
6281
|
-
|
6288
|
+
return [
|
6289
|
+
{
|
6290
|
+
start: overlaps[1].start,
|
6291
|
+
end: overlaps[0].end
|
6292
|
+
}
|
6293
|
+
];
|
6282
6294
|
} else if (overlaps[1].start === 0 && overlaps[0].end + 1 === sequenceLength && !originalRangeLinear) {
|
6283
|
-
return [
|
6284
|
-
|
6285
|
-
|
6286
|
-
|
6295
|
+
return [
|
6296
|
+
{
|
6297
|
+
start: overlaps[0].start,
|
6298
|
+
end: overlaps[1].end
|
6299
|
+
}
|
6300
|
+
];
|
6287
6301
|
} else {
|
6288
6302
|
return overlaps;
|
6289
6303
|
}
|
@@ -6291,17 +6305,29 @@ function collapseOverlapsGeneratedFromRangeComparisonIfPossible(overlaps, sequen
|
|
6291
6305
|
const firstOverlap = overlaps[0];
|
6292
6306
|
const secondOverlap = overlaps[1];
|
6293
6307
|
const thirdOverlap = overlaps[2];
|
6294
|
-
let collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
6308
|
+
let collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
6309
|
+
[firstOverlap, secondOverlap],
|
6310
|
+
sequenceLength,
|
6311
|
+
optionalOriginalRange
|
6312
|
+
);
|
6295
6313
|
if (collapsedOverlaps.length === 1) {
|
6296
6314
|
collapsedOverlaps.push(thirdOverlap);
|
6297
6315
|
return collapsedOverlaps;
|
6298
6316
|
} else {
|
6299
|
-
collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
6317
|
+
collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
6318
|
+
[firstOverlap, thirdOverlap],
|
6319
|
+
sequenceLength,
|
6320
|
+
optionalOriginalRange
|
6321
|
+
);
|
6300
6322
|
if (collapsedOverlaps.length === 1) {
|
6301
6323
|
collapsedOverlaps.push(secondOverlap);
|
6302
6324
|
return collapsedOverlaps;
|
6303
6325
|
} else {
|
6304
|
-
collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
6326
|
+
collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
6327
|
+
[secondOverlap, thirdOverlap],
|
6328
|
+
sequenceLength,
|
6329
|
+
optionalOriginalRange
|
6330
|
+
);
|
6305
6331
|
if (collapsedOverlaps.length === 1) {
|
6306
6332
|
collapsedOverlaps.push(firstOverlap);
|
6307
6333
|
return collapsedOverlaps;
|
@@ -6323,11 +6349,18 @@ function convertRangeIndices(range, inputType, outputType) {
|
|
6323
6349
|
}
|
6324
6350
|
__name(convertRangeIndices, "convertRangeIndices");
|
6325
6351
|
function convertRangeTo0Based(range) {
|
6326
|
-
return convertRangeIndices(range, {
|
6352
|
+
return convertRangeIndices(range, {
|
6353
|
+
inclusive1BasedStart: true,
|
6354
|
+
inclusive1BasedEnd: true
|
6355
|
+
});
|
6327
6356
|
}
|
6328
6357
|
__name(convertRangeTo0Based, "convertRangeTo0Based");
|
6329
6358
|
function convertRangeTo1Based(range) {
|
6330
|
-
return convertRangeIndices(
|
6359
|
+
return convertRangeIndices(
|
6360
|
+
range,
|
6361
|
+
{},
|
6362
|
+
{ inclusive1BasedStart: true, inclusive1BasedEnd: true }
|
6363
|
+
);
|
6331
6364
|
}
|
6332
6365
|
__name(convertRangeTo1Based, "convertRangeTo1Based");
|
6333
6366
|
function provideInclusiveOptions(funToWrap) {
|
@@ -6442,7 +6475,11 @@ function expandOrContractCircularRangeToPosition(range, position, maxLength) {
|
|
6442
6475
|
let endMoved = true;
|
6443
6476
|
if (range.end >= position) {
|
6444
6477
|
if (position + maxLength - range.start > range.end - position) {
|
6445
|
-
newRange.end = normalizePositionByRangeLength(
|
6478
|
+
newRange.end = normalizePositionByRangeLength(
|
6479
|
+
position - 1,
|
6480
|
+
maxLength,
|
6481
|
+
false
|
6482
|
+
);
|
6446
6483
|
} else {
|
6447
6484
|
newRange.start = position;
|
6448
6485
|
endMoved = false;
|
@@ -6515,19 +6552,32 @@ function expandOrContractRangeToPosition(range, position, maxLength) {
|
|
6515
6552
|
if (range.start > range.end) {
|
6516
6553
|
return expandOrContractCircularRangeToPosition(range, position, maxLength);
|
6517
6554
|
} else {
|
6518
|
-
return expandOrContractNonCircularRangeToPosition(
|
6555
|
+
return expandOrContractNonCircularRangeToPosition(
|
6556
|
+
range,
|
6557
|
+
position
|
6558
|
+
);
|
6519
6559
|
}
|
6520
6560
|
}
|
6521
6561
|
__name(expandOrContractRangeToPosition, "expandOrContractRangeToPosition");
|
6522
6562
|
function translateRange(rangeToBeAdjusted, translateBy, rangeLength) {
|
6523
6563
|
return lodashExports.assign({}, rangeToBeAdjusted, {
|
6524
|
-
start: normalizePositionByRangeLength(
|
6525
|
-
|
6564
|
+
start: normalizePositionByRangeLength(
|
6565
|
+
rangeToBeAdjusted.start + translateBy,
|
6566
|
+
rangeLength
|
6567
|
+
),
|
6568
|
+
end: normalizePositionByRangeLength(
|
6569
|
+
rangeToBeAdjusted.end + translateBy,
|
6570
|
+
rangeLength
|
6571
|
+
)
|
6526
6572
|
});
|
6527
6573
|
}
|
6528
6574
|
__name(translateRange, "translateRange");
|
6529
|
-
function flipRelativeRange(innerRange, outerRange, sequenceLength
|
6530
|
-
const isFullyContained = isRangeWithinRange(
|
6575
|
+
function flipRelativeRange(innerRange, outerRange, sequenceLength) {
|
6576
|
+
const isFullyContained = isRangeWithinRange(
|
6577
|
+
innerRange,
|
6578
|
+
outerRange,
|
6579
|
+
sequenceLength
|
6580
|
+
);
|
6531
6581
|
if (isFullyContained) {
|
6532
6582
|
return flipFullyContainedRange(innerRange, outerRange, sequenceLength);
|
6533
6583
|
} else {
|
@@ -6535,42 +6585,92 @@ function flipRelativeRange(innerRange, outerRange, sequenceLength, options) {
|
|
6535
6585
|
}
|
6536
6586
|
}
|
6537
6587
|
__name(flipRelativeRange, "flipRelativeRange");
|
6538
|
-
function flipNonFullyContainedRange(innerRange, outerRange, sequenceLength
|
6539
|
-
const outerFullyContained = isRangeWithinRange(
|
6588
|
+
function flipNonFullyContainedRange(innerRange, outerRange, sequenceLength) {
|
6589
|
+
const outerFullyContained = isRangeWithinRange(
|
6590
|
+
outerRange,
|
6591
|
+
innerRange,
|
6592
|
+
sequenceLength
|
6593
|
+
);
|
6540
6594
|
let flippedInnerRange;
|
6541
6595
|
if (outerFullyContained) {
|
6542
|
-
const expandBy1 = getRangeLength(
|
6543
|
-
|
6544
|
-
|
6545
|
-
|
6546
|
-
|
6547
|
-
|
6548
|
-
|
6549
|
-
|
6550
|
-
|
6551
|
-
|
6596
|
+
const expandBy1 = getRangeLength(
|
6597
|
+
{
|
6598
|
+
start: innerRange.start,
|
6599
|
+
end: outerRange.start
|
6600
|
+
},
|
6601
|
+
sequenceLength
|
6602
|
+
) - 1;
|
6603
|
+
flippedInnerRange = expandOrContractRangeByLength(
|
6604
|
+
outerRange,
|
6605
|
+
expandBy1,
|
6606
|
+
false,
|
6607
|
+
sequenceLength
|
6608
|
+
);
|
6609
|
+
const expandBy2 = getRangeLength(
|
6610
|
+
{
|
6611
|
+
end: innerRange.end,
|
6612
|
+
start: outerRange.end
|
6613
|
+
},
|
6614
|
+
sequenceLength
|
6615
|
+
) - 1;
|
6616
|
+
flippedInnerRange = expandOrContractRangeByLength(
|
6617
|
+
flippedInnerRange,
|
6618
|
+
expandBy2,
|
6619
|
+
true,
|
6620
|
+
sequenceLength
|
6621
|
+
);
|
6552
6622
|
} else {
|
6553
|
-
const overlaps = getOverlapsOfPotentiallyCircularRanges(
|
6623
|
+
const overlaps = getOverlapsOfPotentiallyCircularRanges(
|
6624
|
+
innerRange,
|
6625
|
+
outerRange,
|
6626
|
+
sequenceLength
|
6627
|
+
);
|
6554
6628
|
if (overlaps.length >= 1) {
|
6555
|
-
let overlapExtendsForward;
|
6556
6629
|
const firstOverlap = overlaps[0];
|
6557
|
-
overlapExtendsForward = firstOverlap.start !== outerRange.start;
|
6558
|
-
const flippedTruncatedInner = flipFullyContainedRange(
|
6630
|
+
const overlapExtendsForward = firstOverlap.start !== outerRange.start;
|
6631
|
+
const flippedTruncatedInner = flipFullyContainedRange(
|
6632
|
+
firstOverlap,
|
6633
|
+
outerRange,
|
6634
|
+
sequenceLength
|
6635
|
+
);
|
6559
6636
|
const lengthToExtend = getRangeLength(innerRange, sequenceLength) - getRangeLength(flippedTruncatedInner, sequenceLength);
|
6560
|
-
flippedInnerRange = expandOrContractRangeByLength(
|
6637
|
+
flippedInnerRange = expandOrContractRangeByLength(
|
6638
|
+
flippedTruncatedInner,
|
6639
|
+
lengthToExtend,
|
6640
|
+
overlapExtendsForward,
|
6641
|
+
sequenceLength
|
6642
|
+
);
|
6561
6643
|
} else {
|
6562
|
-
throw new Error(
|
6644
|
+
throw new Error(
|
6645
|
+
"This case (relative ranges that do not overlap) is unsupported! "
|
6646
|
+
);
|
6563
6647
|
}
|
6564
6648
|
}
|
6565
6649
|
return flippedInnerRange;
|
6566
6650
|
}
|
6567
6651
|
__name(flipNonFullyContainedRange, "flipNonFullyContainedRange");
|
6568
|
-
function flipFullyContainedRange(innerRange, outerRange, sequenceLength
|
6652
|
+
function flipFullyContainedRange(innerRange, outerRange, sequenceLength) {
|
6569
6653
|
const translateBy = -outerRange.start;
|
6570
|
-
const translatedOuterRange = translateRange(
|
6571
|
-
|
6572
|
-
|
6573
|
-
|
6654
|
+
const translatedOuterRange = translateRange(
|
6655
|
+
outerRange,
|
6656
|
+
translateBy,
|
6657
|
+
sequenceLength
|
6658
|
+
);
|
6659
|
+
const translatedInnerRange = translateRange(
|
6660
|
+
innerRange,
|
6661
|
+
translateBy,
|
6662
|
+
sequenceLength
|
6663
|
+
);
|
6664
|
+
const translatedFlippedInnerRange = flipNonOriginSpanningContainedRange(
|
6665
|
+
translatedInnerRange,
|
6666
|
+
translatedOuterRange,
|
6667
|
+
sequenceLength
|
6668
|
+
);
|
6669
|
+
const flippedInnerRange = translateRange(
|
6670
|
+
translatedFlippedInnerRange,
|
6671
|
+
-translateBy,
|
6672
|
+
sequenceLength
|
6673
|
+
);
|
6574
6674
|
return flippedInnerRange;
|
6575
6675
|
}
|
6576
6676
|
__name(flipFullyContainedRange, "flipFullyContainedRange");
|
@@ -6588,7 +6688,10 @@ function generateRandomRange(minStart, maxEnd, maxLength) {
|
|
6588
6688
|
const start = getRandomInt(minStart, maxEnd);
|
6589
6689
|
let end;
|
6590
6690
|
if (maxLength) {
|
6591
|
-
end = normalizePositionByRangeLength(
|
6691
|
+
end = normalizePositionByRangeLength(
|
6692
|
+
getRandomInt(start, start + maxLength),
|
6693
|
+
maxEnd
|
6694
|
+
);
|
6592
6695
|
} else {
|
6593
6696
|
end = getRandomInt(minStart, maxEnd);
|
6594
6697
|
}
|
@@ -6640,7 +6743,11 @@ function getEachPositionInRangeAsArray(range, rangeMax) {
|
|
6640
6743
|
}
|
6641
6744
|
__name(getEachPositionInRangeAsArray, "getEachPositionInRangeAsArray");
|
6642
6745
|
function getLengthOfOverlappingRegionsBetweenTwoRanges(rangeA, rangeB, maxLength) {
|
6643
|
-
const overlaps = getOverlapsOfPotentiallyCircularRanges(
|
6746
|
+
const overlaps = getOverlapsOfPotentiallyCircularRanges(
|
6747
|
+
rangeA,
|
6748
|
+
rangeB,
|
6749
|
+
maxLength
|
6750
|
+
);
|
6644
6751
|
return overlaps.reduce(function(counter, overlap) {
|
6645
6752
|
return counter + getRangeLength(overlap, maxLength);
|
6646
6753
|
}, 0);
|
@@ -6693,13 +6800,16 @@ function getRangesBetweenTwoRanges(range1, range2) {
|
|
6693
6800
|
if (!(range1.start > -1 && range1.end > -1 && range2.start > -1 && range2.end > -1)) {
|
6694
6801
|
return newRanges;
|
6695
6802
|
}
|
6696
|
-
return [
|
6697
|
-
|
6698
|
-
|
6699
|
-
|
6700
|
-
|
6701
|
-
|
6702
|
-
|
6803
|
+
return [
|
6804
|
+
{
|
6805
|
+
start: range1.start,
|
6806
|
+
end: range2.end
|
6807
|
+
},
|
6808
|
+
{
|
6809
|
+
start: range2.start,
|
6810
|
+
end: range1.end
|
6811
|
+
}
|
6812
|
+
];
|
6703
6813
|
}
|
6704
6814
|
__name(getRangesBetweenTwoRanges, "getRangesBetweenTwoRanges");
|
6705
6815
|
function getSequenceWithinRange(range, sequence) {
|
@@ -6731,18 +6841,26 @@ function getShortestDistanceBetweenTwoPositions(position1, position2, sequenceLe
|
|
6731
6841
|
__name(getShortestDistanceBetweenTwoPositions, "getShortestDistanceBetweenTwoPositions");
|
6732
6842
|
function getYOffsetForPotentiallyCircularRange(range, YOffsetLevelsWithRanges, assignYOffsetToRange) {
|
6733
6843
|
let yOffset = [];
|
6734
|
-
const openYOffsetFound = YOffsetLevelsWithRanges.some(
|
6735
|
-
|
6736
|
-
|
6737
|
-
|
6738
|
-
|
6739
|
-
|
6740
|
-
|
6741
|
-
|
6742
|
-
|
6743
|
-
|
6844
|
+
const openYOffsetFound = YOffsetLevelsWithRanges.some(
|
6845
|
+
function(rangesAlreadyAddedToYOffset, index) {
|
6846
|
+
const rangeBlocked = rangesAlreadyAddedToYOffset.some(
|
6847
|
+
function(comparisonRange) {
|
6848
|
+
return checkIfPotentiallyCircularRangesOverlap(
|
6849
|
+
range,
|
6850
|
+
comparisonRange
|
6851
|
+
);
|
6852
|
+
}
|
6853
|
+
);
|
6854
|
+
if (!rangeBlocked) {
|
6855
|
+
yOffset = index;
|
6856
|
+
if (assignYOffsetToRange)
|
6857
|
+
range.yOffset = index;
|
6858
|
+
rangesAlreadyAddedToYOffset.push(range);
|
6859
|
+
return true;
|
6860
|
+
}
|
6861
|
+
return false;
|
6744
6862
|
}
|
6745
|
-
|
6863
|
+
);
|
6746
6864
|
if (!openYOffsetFound) {
|
6747
6865
|
yOffset = YOffsetLevelsWithRanges.length;
|
6748
6866
|
if (assignYOffsetToRange)
|
@@ -6756,7 +6874,11 @@ function getYOffsetsForPotentiallyCircularRanges(ranges, assignYOffsetToRange) {
|
|
6756
6874
|
let maxYOffset = 0;
|
6757
6875
|
const yOffsetLevels = [];
|
6758
6876
|
ranges.forEach(function(range) {
|
6759
|
-
const yOffset = getYOffsetForPotentiallyCircularRange(
|
6877
|
+
const yOffset = getYOffsetForPotentiallyCircularRange(
|
6878
|
+
range,
|
6879
|
+
yOffsetLevels,
|
6880
|
+
assignYOffsetToRange
|
6881
|
+
);
|
6760
6882
|
yOffsets.push(yOffset);
|
6761
6883
|
if (yOffset > maxYOffset) {
|
6762
6884
|
maxYOffset = yOffset;
|
@@ -6789,8 +6911,16 @@ function invertRange$1(rangeOrCaret, rangeMax) {
|
|
6789
6911
|
}
|
6790
6912
|
__name(invertRange$1, "invertRange$1");
|
6791
6913
|
function isPositionCloserToRangeStartThanRangeEnd(position, range, maxLength) {
|
6792
|
-
const distanceFromStart = getShortestDistanceBetweenTwoPositions(
|
6793
|
-
|
6914
|
+
const distanceFromStart = getShortestDistanceBetweenTwoPositions(
|
6915
|
+
range.start,
|
6916
|
+
position,
|
6917
|
+
maxLength
|
6918
|
+
);
|
6919
|
+
const distanceFromEnd = getShortestDistanceBetweenTwoPositions(
|
6920
|
+
range.end,
|
6921
|
+
position,
|
6922
|
+
maxLength
|
6923
|
+
);
|
6794
6924
|
return distanceFromStart <= distanceFromEnd;
|
6795
6925
|
}
|
6796
6926
|
__name(isPositionCloserToRangeStartThanRangeEnd, "isPositionCloserToRangeStartThanRangeEnd");
|
@@ -6835,9 +6965,15 @@ function trimNumberToFitWithin0ToAnotherNumber(numberToBeTrimmed, max) {
|
|
6835
6965
|
}
|
6836
6966
|
__name(trimNumberToFitWithin0ToAnotherNumber, "trimNumberToFitWithin0ToAnotherNumber");
|
6837
6967
|
function zeroSubrangeByContainerRange(subRange, containerRange, sequenceLength) {
|
6838
|
-
const trimmedSubRange = trimRangeByAnotherRange(
|
6968
|
+
const trimmedSubRange = trimRangeByAnotherRange(
|
6969
|
+
subRange,
|
6970
|
+
containerRange,
|
6971
|
+
sequenceLength
|
6972
|
+
);
|
6839
6973
|
if (trimmedSubRange) {
|
6840
|
-
throw new Error(
|
6974
|
+
throw new Error(
|
6975
|
+
"subRange must be fully contained by containerRange! Otherwise this function does not make sense"
|
6976
|
+
);
|
6841
6977
|
}
|
6842
6978
|
const newSubrange = {};
|
6843
6979
|
newSubrange.start = subRange.start - containerRange.start;
|
@@ -6865,12 +7001,24 @@ function modulo(n, m) {
|
|
6865
7001
|
}
|
6866
7002
|
__name(modulo, "modulo");
|
6867
7003
|
function getZeroedRangeOverlaps(annotation, selection, sequenceLength) {
|
6868
|
-
const overlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
7004
|
+
const overlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
|
7005
|
+
getOverlapsOfPotentiallyCircularRanges(
|
7006
|
+
annotation,
|
7007
|
+
selection,
|
7008
|
+
sequenceLength
|
7009
|
+
),
|
7010
|
+
sequenceLength,
|
7011
|
+
annotation
|
7012
|
+
);
|
6869
7013
|
const zeroedOverlaps = overlaps.map((overlap) => {
|
6870
|
-
return zeroSubrangeByContainerRange(
|
6871
|
-
|
6872
|
-
|
6873
|
-
|
7014
|
+
return zeroSubrangeByContainerRange(
|
7015
|
+
overlap,
|
7016
|
+
{
|
7017
|
+
start: selection.start,
|
7018
|
+
end: normalizePositionByRangeLength(selection.start - 1, sequenceLength)
|
7019
|
+
},
|
7020
|
+
sequenceLength
|
7021
|
+
);
|
6874
7022
|
});
|
6875
7023
|
return zeroedOverlaps;
|
6876
7024
|
}
|