@teselagen/range-utils 0.3.6 → 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.
Files changed (89) hide show
  1. package/README.md +94 -0
  2. package/flipContainedRange.d.ts +1 -1
  3. package/index.js +233 -85
  4. package/index.mjs +233 -85
  5. package/index.umd.js +233 -85
  6. package/package.json +1 -2
  7. package/src/adjustRangeToDeletionOfAnotherRange.test.js +166 -105
  8. package/src/adjustRangeToInsert.js +29 -26
  9. package/src/adjustRangeToInsert.test.js +197 -109
  10. package/src/adjustRangeToRotation.js +4 -5
  11. package/src/adjustRangeToRotation.test.js +203 -119
  12. package/src/checkIfNonCircularRangesOverlap.js +18 -15
  13. package/src/checkIfNonCircularRangesOverlap.test.js +67 -42
  14. package/src/checkIfPotentiallyCircularRangesOverlap.js +22 -12
  15. package/src/checkIfPotentiallyCircularRangesOverlap.test.js +115 -70
  16. package/src/collapseOverlapsGeneratedFromRangeComparisonIfPossible.js +72 -41
  17. package/src/collapseOverlapsGeneratedFromRangeComparisonIfPossible.test.js +183 -84
  18. package/src/convertRangeIndices.js +24 -20
  19. package/src/convertRangeIndices.test.js +40 -21
  20. package/src/convertRangeTo0Based.js +7 -4
  21. package/src/convertRangeTo1Based.js +8 -4
  22. package/src/doesRangeSpanEntireSequence.js +4 -4
  23. package/src/doesRangeSpanOrigin.js +3 -3
  24. package/src/expandOrContractCircularRangeToPosition.js +45 -38
  25. package/src/expandOrContractNonCircularRangeToPosition.js +24 -21
  26. package/src/expandOrContractRangeByLength.js +16 -11
  27. package/src/expandOrContractRangeByLength.test.js +109 -71
  28. package/src/expandOrContractRangeToPosition.js +17 -9
  29. package/src/flipContainedRange.js +133 -72
  30. package/src/flipContainedRange.test.js +143 -117
  31. package/src/generateRandomRange.js +17 -15
  32. package/src/generateRandomRange.test.js +21 -21
  33. package/src/getAnnotationRangeType.js +25 -21
  34. package/src/getAnnotationRangeType.test.js +56 -57
  35. package/src/getEachPositionInRangeAsArray.js +13 -13
  36. package/src/getEachPositionInRangeAsArray.test.js +12 -8
  37. package/src/getLengthOfOverlappingRegionsBetweenTwoRanges.js +16 -8
  38. package/src/getLengthOfOverlappingRegionsBetweenTwoRanges.test.js +32 -24
  39. package/src/getMiddleOfRange.js +1 -1
  40. package/src/getMiddleOfRange.test.js +5 -13
  41. package/src/getOverlapOfNonCircularRanges.js +30 -30
  42. package/src/getOverlapsOfPotentiallyCircularRanges.js +5 -5
  43. package/src/getOverlapsOfPotentiallyCircularRanges.test.js +3 -23
  44. package/src/getPositionFromAngle.js +12 -7
  45. package/src/getRangeAngles.js +1 -1
  46. package/src/getRangeAngles.test.js +10 -11
  47. package/src/getRangeLength.test.js +5 -5
  48. package/src/getRangesBetweenTwoRanges.js +31 -22
  49. package/src/getSequenceWithinRange.js +13 -13
  50. package/src/getSequenceWithinRange.test.js +43 -45
  51. package/src/getShortestDistanceBetweenTwoPositions.js +10 -6
  52. package/src/getShortestDistanceBetweenTwoPositions.test.js +11 -13
  53. package/src/getYOffsetForPotentiallyCircularRange.js +33 -21
  54. package/src/getYOffsetsForPotentiallyCircularRanges.js +26 -19
  55. package/src/getYOffsetsForPotentiallyCircularRanges.test.js +42 -29
  56. package/src/getZeroedRangeOverlaps.js +30 -15
  57. package/src/getZeroedRangeOverlaps.test.js +75 -36
  58. package/src/index.js +51 -51
  59. package/src/index.test.js +6 -8
  60. package/src/invertRange.test.js +103 -93
  61. package/src/isPositionCloserToRangeStartThanRangeEnd.js +18 -6
  62. package/src/isPositionCloserToRangeStartThanRangeEnd.test.js +36 -16
  63. package/src/isPositionWithinRange.js +4 -4
  64. package/src/isRangeOrPositionWithinRange.js +18 -12
  65. package/src/isRangeOrPositionWithinRange.test.js +6 -6
  66. package/src/isRangeWithinRange.js +2 -3
  67. package/src/loopEachPositionInRange.js +3 -3
  68. package/src/modulatePositionByRange.js +8 -8
  69. package/src/modulatePositionByRange.test.js +10 -11
  70. package/src/modulateRangeBySequenceLength.js +7 -7
  71. package/src/modulateRangeBySequenceLength.test.js +39 -16
  72. package/src/normalizePositionByRangeLength.js +22 -18
  73. package/src/normalizePositionByRangeLength.test.js +23 -23
  74. package/src/normalizePositionByRangeLength1Based.js +7 -4
  75. package/src/normalizePositionByRangeLength1Based.test.js +9 -9
  76. package/src/normalizeRange.js +7 -7
  77. package/src/normalizeRange.test.js +9 -9
  78. package/src/provideInclusiveOptions.js +36 -23
  79. package/src/reversePositionInRange.js +16 -12
  80. package/src/splitRangeIntoTwoPartsIfItIsCircular.js +31 -28
  81. package/src/splitRangeIntoTwoPartsIfItIsCircular.test.js +22 -11
  82. package/src/translateRange.js +18 -8
  83. package/src/translateRange.test.js +18 -19
  84. package/src/trimNonCicularRangeByAnotherNonCircularRange.js +45 -42
  85. package/src/trimNumberToFitWithin0ToAnotherNumber.js +13 -10
  86. package/src/trimRangeByAnotherRange.js +20 -19
  87. package/src/trimRangeByAnotherRange.test.js +6 -6
  88. package/src/zeroSubrangeByContainerRange.js +29 -19
  89. 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).
@@ -1 +1 @@
1
- export default function flipRelativeRange(innerRange: any, outerRange: any, sequenceLength: any, options: any): 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, iA) {
6051
- normalizedRangeB.forEach(function(nonCircularRangeB, iB) {
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, i) => {
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(function(trimmedRange) {
6162
- if (trimmedRange) {
6163
- return true;
6161
+ const outputSplitRanges = splitRangesToBeTrimmed.filter(
6162
+ function(trimmedRange) {
6163
+ if (trimmedRange) {
6164
+ return true;
6165
+ }
6166
+ return false;
6164
6167
  }
6165
- return false;
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(function(splitRange) {
6266
- return splitRangeIntoTwoPartsIfItIsCircular(comparisonRange, Infinity).some(function(splitComparisonRange) {
6267
- return checkIfNonCircularRangesOverlap(splitRange, splitComparisonRange);
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
- start: overlaps[1].start,
6280
- end: overlaps[0].end
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
- start: overlaps[0].start,
6285
- end: overlaps[1].end
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([firstOverlap, secondOverlap], sequenceLength, optionalOriginalRange);
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([firstOverlap, thirdOverlap], sequenceLength, optionalOriginalRange);
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([secondOverlap, thirdOverlap], sequenceLength, optionalOriginalRange);
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, { inclusive1BasedStart: true, inclusive1BasedEnd: true });
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(range, {}, { inclusive1BasedStart: true, inclusive1BasedEnd: true });
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(position - 1, maxLength, false);
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(range, position);
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(rangeToBeAdjusted.start + translateBy, rangeLength),
6525
- end: normalizePositionByRangeLength(rangeToBeAdjusted.end + translateBy, rangeLength)
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, options) {
6530
- const isFullyContained = isRangeWithinRange(innerRange, outerRange, sequenceLength);
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, options) {
6539
- const outerFullyContained = isRangeWithinRange(outerRange, innerRange, sequenceLength);
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
- start: innerRange.start,
6544
- end: outerRange.start
6545
- }, sequenceLength) - 1;
6546
- flippedInnerRange = expandOrContractRangeByLength(outerRange, expandBy1, false, sequenceLength);
6547
- const expandBy2 = getRangeLength({
6548
- end: innerRange.end,
6549
- start: outerRange.end
6550
- }, sequenceLength) - 1;
6551
- flippedInnerRange = expandOrContractRangeByLength(flippedInnerRange, expandBy2, true, sequenceLength);
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(innerRange, outerRange, sequenceLength);
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(firstOverlap, outerRange, sequenceLength);
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(flippedTruncatedInner, lengthToExtend, overlapExtendsForward, sequenceLength);
6637
+ flippedInnerRange = expandOrContractRangeByLength(
6638
+ flippedTruncatedInner,
6639
+ lengthToExtend,
6640
+ overlapExtendsForward,
6641
+ sequenceLength
6642
+ );
6561
6643
  } else {
6562
- throw new Error("This case (relative ranges that do not overlap) is unsupported! ");
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, options) {
6652
+ function flipFullyContainedRange(innerRange, outerRange, sequenceLength) {
6569
6653
  const translateBy = -outerRange.start;
6570
- const translatedOuterRange = translateRange(outerRange, translateBy, sequenceLength);
6571
- const translatedInnerRange = translateRange(innerRange, translateBy, sequenceLength);
6572
- const translatedFlippedInnerRange = flipNonOriginSpanningContainedRange(translatedInnerRange, translatedOuterRange, sequenceLength);
6573
- const flippedInnerRange = translateRange(translatedFlippedInnerRange, -translateBy, sequenceLength);
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(getRandomInt(start, start + maxLength), maxEnd);
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(rangeA, rangeB, maxLength);
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
- start: range1.start,
6698
- end: range2.end
6699
- }, {
6700
- start: range2.start,
6701
- end: range1.end
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(function(rangesAlreadyAddedToYOffset, index) {
6735
- const rangeBlocked = rangesAlreadyAddedToYOffset.some(function(comparisonRange) {
6736
- return checkIfPotentiallyCircularRangesOverlap(range, comparisonRange);
6737
- });
6738
- if (!rangeBlocked) {
6739
- yOffset = index;
6740
- if (assignYOffsetToRange)
6741
- range.yOffset = index;
6742
- rangesAlreadyAddedToYOffset.push(range);
6743
- return true;
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(range, yOffsetLevels, assignYOffsetToRange);
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(range.start, position, maxLength);
6793
- const distanceFromEnd = getShortestDistanceBetweenTwoPositions(range.end, position, maxLength);
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(subRange, containerRange, sequenceLength);
6968
+ const trimmedSubRange = trimRangeByAnotherRange(
6969
+ subRange,
6970
+ containerRange,
6971
+ sequenceLength
6972
+ );
6839
6973
  if (trimmedSubRange) {
6840
- throw new Error("subRange must be fully contained by containerRange! Otherwise this function does not make sense");
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(getOverlapsOfPotentiallyCircularRanges(annotation, selection, sequenceLength), sequenceLength, annotation);
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(overlap, {
6871
- start: selection.start,
6872
- end: normalizePositionByRangeLength(selection.start - 1, sequenceLength)
6873
- }, sequenceLength);
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
  }