@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
@@ -1,123 +1,207 @@
1
- import adjustRangeToRotation from './adjustRangeToRotation.js';
1
+ import adjustRangeToRotation from "./adjustRangeToRotation.js";
2
2
 
3
- import assert from 'assert';
3
+ import assert from "assert";
4
4
 
5
+ describe("adjustRangeToRotation", function () {
6
+ it("defaults to a rotateBy=0 if a null or undefined is passed ", () => {
7
+ assert.deepEqual(
8
+ adjustRangeToRotation(
9
+ {
10
+ start: 1,
11
+ end: 2
12
+ },
13
+ null,
14
+ 10
15
+ ),
16
+ {
17
+ start: 1,
18
+ end: 2
19
+ }
20
+ );
5
21
 
6
- ;
7
- describe('adjustRangeToRotation', function() {
8
- it('defaults to a rotateBy=0 if a null or undefined is passed ', () => {
9
- assert.deepEqual(adjustRangeToRotation({
10
- start: 1,
11
- end: 2
12
- }, null, 10), {
13
- start: 1,
14
- end: 2
15
- });
16
-
17
- assert.deepEqual(adjustRangeToRotation({
18
- start: 1,
19
- end: 2
20
- }, undefined, 10), {
21
- start: 1,
22
- end: 2
23
- });
24
- assert.deepEqual(adjustRangeToRotation({
25
- start: 1,
26
- end: 2
27
- }, NaN, 10), {
28
- start: 1,
29
- end: 2
30
- });
31
-
32
- });
33
- it('defaults to an infinite length if no length is passed', () => {
34
- assert.deepEqual(adjustRangeToRotation({
35
- start: 1,
36
- end: 2
37
- }, 1, null), {
38
- start: 0,
39
- end: 1
40
- });
41
- assert.deepEqual(adjustRangeToRotation({
42
- start: 1,
43
- end: 2
44
- }, 1, undefined), {
45
- start: 0,
46
- end: 1
47
- });
48
-
49
-
50
-
51
- });
52
- it('shifts start and end if rotating before non circular range', function() {
53
- //0123456789
54
- //atgcatgccc
55
- // rr
56
- //
57
- assert.deepEqual(adjustRangeToRotation({
58
- start: 1,
59
- end: 2
60
- }, 1, 10), {
61
- start: 0,
62
- end: 1
63
- });
64
- assert.deepEqual(adjustRangeToRotation({
65
- start: 1,
66
- end: 2
67
- }, undefined, 10), {
68
- start: 1,
69
- end: 2
70
- });
71
- assert.deepEqual(adjustRangeToRotation({
72
- start: 1,
73
- end: 2
74
- }, 2, 10), {
75
- start: 9,
76
- end: 0
77
- });
78
- assert.deepEqual(adjustRangeToRotation({
79
- start: 1,
80
- end: 2
81
- }, 3, 10), {
82
- start: 8,
83
- end: 9
84
- });
85
- //0123456789
86
- //atgcatgccc
87
- //rrrrr rrr
88
- //
89
- assert.deepEqual(adjustRangeToRotation({
90
- start: 7,
91
- end: 4
92
- }, 3, 10), {
93
- start: 4,
94
- end: 1
95
- });
96
- assert.deepEqual(adjustRangeToRotation({
97
- start: 7,
98
- end: 4
99
- }, 5, 10), {
100
- start: 2,
101
- end: 9
102
- });
103
- assert.deepEqual(adjustRangeToRotation({
104
- start: 7,
105
- end: 4
106
- }, 6, 10), {
107
- start: 1,
108
- end: 8
109
- });
110
- //0123456 789
111
- //atgcatg ccc
112
- //rrrrrrr rrr
113
- //
114
- assert.deepEqual(adjustRangeToRotation({
115
- start: 7,
116
- end: 6
117
- }, 3, 10), {
118
- start: 4,
119
- end: 3
120
- });
121
- });
122
-
22
+ assert.deepEqual(
23
+ adjustRangeToRotation(
24
+ {
25
+ start: 1,
26
+ end: 2
27
+ },
28
+ undefined,
29
+ 10
30
+ ),
31
+ {
32
+ start: 1,
33
+ end: 2
34
+ }
35
+ );
36
+ assert.deepEqual(
37
+ adjustRangeToRotation(
38
+ {
39
+ start: 1,
40
+ end: 2
41
+ },
42
+ NaN,
43
+ 10
44
+ ),
45
+ {
46
+ start: 1,
47
+ end: 2
48
+ }
49
+ );
50
+ });
51
+ it("defaults to an infinite length if no length is passed", () => {
52
+ assert.deepEqual(
53
+ adjustRangeToRotation(
54
+ {
55
+ start: 1,
56
+ end: 2
57
+ },
58
+ 1,
59
+ null
60
+ ),
61
+ {
62
+ start: 0,
63
+ end: 1
64
+ }
65
+ );
66
+ assert.deepEqual(
67
+ adjustRangeToRotation(
68
+ {
69
+ start: 1,
70
+ end: 2
71
+ },
72
+ 1,
73
+ undefined
74
+ ),
75
+ {
76
+ start: 0,
77
+ end: 1
78
+ }
79
+ );
80
+ });
81
+ it("shifts start and end if rotating before non circular range", function () {
82
+ //0123456789
83
+ //atgcatgccc
84
+ // rr
85
+ //
86
+ assert.deepEqual(
87
+ adjustRangeToRotation(
88
+ {
89
+ start: 1,
90
+ end: 2
91
+ },
92
+ 1,
93
+ 10
94
+ ),
95
+ {
96
+ start: 0,
97
+ end: 1
98
+ }
99
+ );
100
+ assert.deepEqual(
101
+ adjustRangeToRotation(
102
+ {
103
+ start: 1,
104
+ end: 2
105
+ },
106
+ undefined,
107
+ 10
108
+ ),
109
+ {
110
+ start: 1,
111
+ end: 2
112
+ }
113
+ );
114
+ assert.deepEqual(
115
+ adjustRangeToRotation(
116
+ {
117
+ start: 1,
118
+ end: 2
119
+ },
120
+ 2,
121
+ 10
122
+ ),
123
+ {
124
+ start: 9,
125
+ end: 0
126
+ }
127
+ );
128
+ assert.deepEqual(
129
+ adjustRangeToRotation(
130
+ {
131
+ start: 1,
132
+ end: 2
133
+ },
134
+ 3,
135
+ 10
136
+ ),
137
+ {
138
+ start: 8,
139
+ end: 9
140
+ }
141
+ );
142
+ //0123456789
143
+ //atgcatgccc
144
+ //rrrrr rrr
145
+ //
146
+ assert.deepEqual(
147
+ adjustRangeToRotation(
148
+ {
149
+ start: 7,
150
+ end: 4
151
+ },
152
+ 3,
153
+ 10
154
+ ),
155
+ {
156
+ start: 4,
157
+ end: 1
158
+ }
159
+ );
160
+ assert.deepEqual(
161
+ adjustRangeToRotation(
162
+ {
163
+ start: 7,
164
+ end: 4
165
+ },
166
+ 5,
167
+ 10
168
+ ),
169
+ {
170
+ start: 2,
171
+ end: 9
172
+ }
173
+ );
174
+ assert.deepEqual(
175
+ adjustRangeToRotation(
176
+ {
177
+ start: 7,
178
+ end: 4
179
+ },
180
+ 6,
181
+ 10
182
+ ),
183
+ {
184
+ start: 1,
185
+ end: 8
186
+ }
187
+ );
188
+ //0123456 789
189
+ //atgcatg ccc
190
+ //rrrrrrr rrr
191
+ //
192
+ assert.deepEqual(
193
+ adjustRangeToRotation(
194
+ {
195
+ start: 7,
196
+ end: 6
197
+ },
198
+ 3,
199
+ 10
200
+ ),
201
+ {
202
+ start: 4,
203
+ end: 3
204
+ }
205
+ );
206
+ });
123
207
  });
@@ -1,30 +1,33 @@
1
1
  //
2
2
  // ac.throw([ac.posInt, ac.posInt, ac.bool], arguments);
3
- export default function checkIfNonCircularRangesOverlap(range, comparisonRange) {
4
- // ac.throw([ac.range, ac.range], arguments);
5
- if (range.start < comparisonRange.start) {
6
- if (range.end < comparisonRange.start) {
3
+ export default function checkIfNonCircularRangesOverlap(
4
+ range,
5
+ comparisonRange
6
+ ) {
7
+ // ac.throw([ac.range, ac.range], arguments);
8
+ if (range.start < comparisonRange.start) {
9
+ if (range.end < comparisonRange.start) {
7
10
  //----llll
8
11
  //--------cccc
9
12
  //no overlap
10
- return false;
11
- } else {
13
+ return false;
14
+ } else {
12
15
  //----llll
13
16
  //-------cccc
14
17
  //overlap
15
- return true;
16
- }
17
- } else {
18
- if (range.start > comparisonRange.end) {
18
+ return true;
19
+ }
20
+ } else {
21
+ if (range.start > comparisonRange.end) {
19
22
  //------llll
20
23
  // -cccc
21
24
  //no overlap
22
- return false;
23
- } else {
25
+ return false;
26
+ } else {
24
27
  //-----llll
25
28
  // -cccc
26
29
  //overlap
27
- return true;
28
- }
30
+ return true;
29
31
  }
30
- };
32
+ }
33
+ }
@@ -1,45 +1,70 @@
1
- import {expect} from 'chai';
1
+ import { expect } from "chai";
2
2
 
3
- import checkIfNonCircularRangesOverlap from './checkIfNonCircularRangesOverlap.js';
3
+ import checkIfNonCircularRangesOverlap from "./checkIfNonCircularRangesOverlap.js";
4
4
  // checkIfNonCircularRangesOverlap(frame, sequence, minimumOrfSize, forward, circular)
5
- describe('checkIfNonCircularRangesOverlap', function() {
6
- it('returns true if non circular ranges do overlap', function() {
7
- expect(checkIfNonCircularRangesOverlap({
8
- start: 5,
9
- end: 100
10
- }, {
11
- start: 50,
12
- end: 50
13
- })).to.equal(true);
14
- expect(checkIfNonCircularRangesOverlap({
15
- start: 5,
16
- end: 100
17
- }, {
18
- start: 50,
19
- end: 500
20
- })).to.equal(true);
21
- expect(checkIfNonCircularRangesOverlap({
22
- start: 5,
23
- end: 100
24
- }, {
25
- start: 0,
26
- end: 5
27
- })).to.equal(true);
28
- });
29
- it('returns false if non circular ranges do not overlap', function() {
30
- expect(checkIfNonCircularRangesOverlap({
31
- start: 5,
32
- end: 100
33
- }, {
34
- start: 1,
35
- end: 4
36
- })).to.equal(false);
37
- expect(checkIfNonCircularRangesOverlap({
38
- start: 5,
39
- end: 100
40
- }, {
41
- start: 101,
42
- end: 101
43
- })).to.equal(false);
44
- });
5
+ describe("checkIfNonCircularRangesOverlap", function () {
6
+ it("returns true if non circular ranges do overlap", function () {
7
+ expect(
8
+ checkIfNonCircularRangesOverlap(
9
+ {
10
+ start: 5,
11
+ end: 100
12
+ },
13
+ {
14
+ start: 50,
15
+ end: 50
16
+ }
17
+ )
18
+ ).to.equal(true);
19
+ expect(
20
+ checkIfNonCircularRangesOverlap(
21
+ {
22
+ start: 5,
23
+ end: 100
24
+ },
25
+ {
26
+ start: 50,
27
+ end: 500
28
+ }
29
+ )
30
+ ).to.equal(true);
31
+ expect(
32
+ checkIfNonCircularRangesOverlap(
33
+ {
34
+ start: 5,
35
+ end: 100
36
+ },
37
+ {
38
+ start: 0,
39
+ end: 5
40
+ }
41
+ )
42
+ ).to.equal(true);
43
+ });
44
+ it("returns false if non circular ranges do not overlap", function () {
45
+ expect(
46
+ checkIfNonCircularRangesOverlap(
47
+ {
48
+ start: 5,
49
+ end: 100
50
+ },
51
+ {
52
+ start: 1,
53
+ end: 4
54
+ }
55
+ )
56
+ ).to.equal(false);
57
+ expect(
58
+ checkIfNonCircularRangesOverlap(
59
+ {
60
+ start: 5,
61
+ end: 100
62
+ },
63
+ {
64
+ start: 101,
65
+ end: 101
66
+ }
67
+ )
68
+ ).to.equal(false);
69
+ });
45
70
  });
@@ -1,16 +1,26 @@
1
1
  //
2
- import checkIfNonCircularRangesOverlap from './checkIfNonCircularRangesOverlap';
2
+ import checkIfNonCircularRangesOverlap from "./checkIfNonCircularRangesOverlap";
3
3
 
4
- import splitRangeIntoTwoPartsIfItIsCircular from './splitRangeIntoTwoPartsIfItIsCircular';
4
+ import splitRangeIntoTwoPartsIfItIsCircular from "./splitRangeIntoTwoPartsIfItIsCircular";
5
5
  // ac.throw([ac.posInt, ac.posInt, ac.bool], arguments);
6
6
 
7
- export default function checkIfPotentiallyCircularRangesOverlap(range, comparisonRange) {
8
- // ac.throw([ac.range, ac.range], arguments);
9
- //split the potentially circular ranges and compare each part for overlap
10
- return splitRangeIntoTwoPartsIfItIsCircular(range, Infinity).some(function (splitRange) {
11
- return splitRangeIntoTwoPartsIfItIsCircular(comparisonRange, Infinity).some(function (splitComparisonRange) {
12
- return checkIfNonCircularRangesOverlap(splitRange, splitComparisonRange);
13
- })
14
- })
15
- };
16
-
7
+ export default function checkIfPotentiallyCircularRangesOverlap(
8
+ range,
9
+ comparisonRange
10
+ ) {
11
+ // ac.throw([ac.range, ac.range], arguments);
12
+ //split the potentially circular ranges and compare each part for overlap
13
+ return splitRangeIntoTwoPartsIfItIsCircular(range, Infinity).some(
14
+ function (splitRange) {
15
+ return splitRangeIntoTwoPartsIfItIsCircular(
16
+ comparisonRange,
17
+ Infinity
18
+ ).some(function (splitComparisonRange) {
19
+ return checkIfNonCircularRangesOverlap(
20
+ splitRange,
21
+ splitComparisonRange
22
+ );
23
+ });
24
+ }
25
+ );
26
+ }