|
@@ -12,23 +12,23 @@ import Segs from '../segmentation'
|
|
|
|
|
|
interface Segmentation {
|
|
|
/** Segments stored as a sorted array */
|
|
|
- segments: SortedArray,
|
|
|
+ offsets: SortedArray,
|
|
|
/** Mapping of values to segments */
|
|
|
- segmentMap: Int32Array,
|
|
|
+ index: Int32Array,
|
|
|
/** Number of segments */
|
|
|
count: number
|
|
|
}
|
|
|
|
|
|
export function create(values: ArrayLike<number>): Segmentation {
|
|
|
- const segments = SortedArray.ofSortedArray(values);
|
|
|
- const max = SortedArray.max(segments);
|
|
|
- const segmentMap = new Int32Array(max);
|
|
|
+ const offsets = SortedArray.ofSortedArray(values);
|
|
|
+ const max = SortedArray.max(offsets);
|
|
|
+ const index = new Int32Array(max);
|
|
|
for (let i = 0, _i = values.length - 1; i < _i; i++) {
|
|
|
for (let j = values[i], _j = values[i + 1]; j < _j; j++) {
|
|
|
- segmentMap[j] = i;
|
|
|
+ index[j] = i;
|
|
|
}
|
|
|
}
|
|
|
- return { segments, segmentMap, count: values.length - 1 };
|
|
|
+ return { offsets, index, count: values.length - 1 };
|
|
|
}
|
|
|
|
|
|
export function ofOffsets(offsets: ArrayLike<number>, bounds: Interval): Segmentation {
|
|
@@ -42,12 +42,12 @@ export function ofOffsets(offsets: ArrayLike<number>, bounds: Interval): Segment
|
|
|
}
|
|
|
|
|
|
export function count({ count }: Segmentation) { return count; }
|
|
|
-export function getSegment({ segmentMap }: Segmentation, value: number) { return segmentMap[value]; }
|
|
|
+export function getSegment({ index }: Segmentation, value: number) { return index[value]; }
|
|
|
|
|
|
-export function projectValue({ segments }: Segmentation, set: OrderedSet, value: number): Interval {
|
|
|
- const last = OrderedSet.max(segments);
|
|
|
- const idx = value >= last ? -1 : OrderedSet.findPredecessorIndex(segments, value - 1);
|
|
|
- return OrderedSet.findRange(set, OrderedSet.getAt(segments, idx), OrderedSet.getAt(segments, idx + 1) - 1);
|
|
|
+export function projectValue({ offsets }: Segmentation, set: OrderedSet, value: number): Interval {
|
|
|
+ const last = OrderedSet.max(offsets);
|
|
|
+ const idx = value >= last ? -1 : OrderedSet.findPredecessorIndex(offsets, value - 1);
|
|
|
+ return OrderedSet.findRange(set, OrderedSet.getAt(offsets, idx), OrderedSet.getAt(offsets, idx + 1) - 1);
|
|
|
}
|
|
|
|
|
|
export class SegmentIterator<T extends number = number> implements Iterator<Segs.Segment<T>> {
|
|
@@ -107,5 +107,5 @@ export class SegmentIterator<T extends number = number> implements Iterator<Segs
|
|
|
|
|
|
export function segments(segs: Segmentation, set: OrderedSet, segment?: Segs.Segment) {
|
|
|
const int = typeof segment !== 'undefined' ? Interval.ofBounds(segment.start, segment.end) : Interval.ofBounds(0, OrderedSet.size(set));
|
|
|
- return new SegmentIterator(segs.segments, segs.segmentMap, set, int);
|
|
|
+ return new SegmentIterator(segs.offsets, segs.index, set, int);
|
|
|
}
|