2
2
any ,
3
3
aperture ,
4
4
applySpec ,
5
+ chain ,
5
6
concat ,
6
7
converge ,
7
8
dissoc ,
@@ -85,7 +86,7 @@ const prepareInput = (typeStr: string, i: interval | roai): IntervalSE[] => {
85
86
86
87
const complementGen = ( boundaries : IntervalSE , intervals : IntervalSE [ ] ) : IntervalSE [ ] => {
87
88
const intervalsS = sortByStart ( intervals ) ;
88
- const { start, end, ...rest } = boundaries ;
89
+ const { start, end, ...rest } = boundaries ;
89
90
const prepRanges : IntervalSE [ ] = [
90
91
{ start : - Infinity , end : start } ,
91
92
...intervalsS ,
@@ -99,7 +100,10 @@ const complementGen = (boundaries: IntervalSE, intervals: IntervalSE[]): Interva
99
100
) as IntervalSE [ ] ;
100
101
} ;
101
102
102
- const complementCurry = < D extends interval , T extends interval > ( boundaries : D , intervals : T | T [ ] ) : D [ ] => {
103
+ const complementCurry = < D extends interval , T extends interval > (
104
+ boundaries : D ,
105
+ intervals : T | T [ ]
106
+ ) : D [ ] => {
103
107
if ( Array . isArray ( intervals ) && intervals . length < 1 ) {
104
108
return [ boundaries ] as D [ ] ;
105
109
}
@@ -123,9 +127,17 @@ const complementCurry = <D extends interval, T extends interval>(boundaries: D,
123
127
* @param intervals arg2: one interval or array of intervals that complement the result.
124
128
* @returns array of intervals.
125
129
*/
126
- export function complement < D extends interval , T extends interval > ( boundaries : D , interv : T | roat < T > ) : D [ ] ;
127
- export function complement < D extends interval , T extends interval > ( boundaries : D ) : ( interv : T | roat < T > ) => D [ ] ;
128
- export function complement < D extends interval , T extends interval > ( boundaries : D , interv ?: T | roat < T > ) : any {
130
+ export function complement < D extends interval , T extends interval > (
131
+ boundaries : D ,
132
+ interv : T | roat < T >
133
+ ) : D [ ] ;
134
+ export function complement < D extends interval , T extends interval > (
135
+ boundaries : D
136
+ ) : ( interv : T | roat < T > ) => D [ ] ;
137
+ export function complement < D extends interval , T extends interval > (
138
+ boundaries : D ,
139
+ interv ?: T | roat < T >
140
+ ) : any {
129
141
switch ( arguments . length ) {
130
142
case 1 :
131
143
return ( tt2 : T | T [ ] ) : D [ ] => {
@@ -502,9 +514,9 @@ const intersectUnfolderSeed = (
502
514
return [ new1 , new2 ] ;
503
515
} ;
504
516
505
- const intersectUnfolder = (
506
- [ inters1 , inters2 ] : [ IntervalSE [ ] , IntervalSE [ ] ]
507
- ) : false | [ IntervalSE | null , [ IntervalSE [ ] , IntervalSE [ ] ] ] => {
517
+ const intersectUnfolder = ( [ inters1 , inters2 ] : [ IntervalSE [ ] , IntervalSE [ ] ] ) :
518
+ | false
519
+ | [ IntervalSE | null , [ IntervalSE [ ] , IntervalSE [ ] ] ] => {
508
520
if ( any ( isEmpty ) ( [ inters1 , inters2 ] ) ) {
509
521
return false ;
510
522
}
@@ -656,7 +668,10 @@ const substractGen = (base: IntervalSE[], mask: IntervalSE[]): IntervalSE[] => {
656
668
* @param intervalB arg2: one interval or array of intervals
657
669
* @returns intersection of `arg1` and `arg2`
658
670
*/
659
- export function substract < D extends interval , T extends interval > ( intervalA : D | roat < D > , intervalB : T | roat < T > ) : D [ ] ;
671
+ export function substract < D extends interval , T extends interval > (
672
+ intervalA : D | roat < D > ,
673
+ intervalB : T | roat < T >
674
+ ) : D [ ] ;
660
675
export function substract < D extends interval , T extends interval > (
661
676
intervalA : D | roat < D >
662
677
) : ( intervalB : T | roat < T > ) => D [ ] ;
@@ -673,3 +688,50 @@ export function substract<D extends interval, T extends interval>(
673
688
return setupForTwoIntsToInts < D > ( substractGen ) ( intervalA , intervalB as any ) ;
674
689
}
675
690
}
691
+
692
+ const numberToRange = ( n : number ) : IntervalSE => ( { start : n , end : n } ) ;
693
+
694
+ const splitGen = ( splits : roat < number > , intervals : IntervalSE [ ] ) : IntervalSE [ ] => {
695
+ return chain ( ( i => {
696
+ return chain ( ( int => [
697
+ { ...int , start : int . start , end : i } ,
698
+ { ...int , start : i , end : int . end } ,
699
+ ] ) , intervals . filter ( int => isOverlappingSimple ( int , numberToRange ( i ) ) ) ) ;
700
+ } ) , splits ) ;
701
+ } ;
702
+
703
+ const splitCurry = < T extends interval > ( splitIndexes : roat < number > , intervals : T | T [ ] ) : T [ ] => {
704
+ if ( Array . isArray ( intervals ) && intervals . length < 1 ) {
705
+ return [ ] ;
706
+ }
707
+ const typeStr = getType ( intervals ) ;
708
+ const intervalSE = prepareInput ( typeStr , intervals ) ;
709
+ return splitGen ( splitIndexes , intervalSE ) . map ( convertTo < T > ( typeStr ) ) ;
710
+ } ;
711
+
712
+ /**
713
+ * Split `intervals` with `splitIndexes`.
714
+ * Keeps extra object properties on `intervals`.
715
+ * Curried function. Accept array of intervals. Doesn't mutate input. Output keeps input's structure.
716
+ *
717
+ * splitIndexes | interval(s) | result
718
+ * --- | --- | ---
719
+ * [2, 4] | { start: 0, end: 6, foo: 'bar' } | [{ start: 0, end: 2, foo: 'bar' }, { start: 2, end: 4, foo: 'bar' } { start: 4, end: 6, foo: 'bar' }]
720
+ * [5] | [{ start: 0, end: 7 }, { start: 3, end: 8 }] | [{ start: 0, end: 5 }, { start: 5, end: 7 }, { start: 3, end: 5 }, { start: 5, end: 8 }]
721
+ *
722
+ * @param splitIndexes arg1: defines indexes where intervals are splitted.
723
+ * @param intervals arg2: intervals to be splitted.
724
+ * @returns array of intervals.
725
+ */
726
+ export function split < T extends interval > ( splitIndexes : roat < number > , interv : T | roat < T > ) : T [ ] ;
727
+ export function split < T extends interval > ( splitIndexes : roat < number > ) : ( interv : T | roat < T > ) => T [ ] ;
728
+ export function split < T extends interval > ( splitIndexes : roat < number > , interv ?: T | roat < T > ) : any {
729
+ switch ( arguments . length ) {
730
+ case 1 :
731
+ return ( tt2 : T | T [ ] ) : T [ ] => {
732
+ return splitCurry < T > ( splitIndexes , tt2 ) ;
733
+ } ;
734
+ case 2 :
735
+ return splitCurry < T > ( splitIndexes , interv as T | T [ ] ) ;
736
+ }
737
+ }
0 commit comments