Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 37x 37x 37x 34x 34x 56x 56x 71x 71x 71x 71x 71x 1x 70x 55x 55x 69x 69x 100x 100x 100x 100x 69x 69x 40x 29x | import * as Immutable from 'immutable';
import * as generalUtils from './general';
import {NumberRange} from './NumberRange';
export class NumberRangeRegistry<T> {
public numberRanges: Immutable.List<NumberRange> = Immutable.List();
public values: Immutable.List<T> = Immutable.List();
register(numberRange: NumberRange, value: T): void {
const index = generalUtils.binarySearch(this.numberRanges, numberRange, {
getLength: (numberRanges) => numberRanges.size,
getNewRange: (numberRanges, numberRangeToInsert, start, end) => {
const mid = Math.floor((start + end) / 2);
const midNumberRange = numberRanges.get(mid)!;
const isEntirelyBeforeMid = numberRangeToInsert.isEntirelyBefore(midNumberRange);
const isEntirelyAfterMid = numberRangeToInsert.isEntirelyAfter(midNumberRange);
if (!isEntirelyBeforeMid && !isEntirelyAfterMid) {
throw new Error(
`Refusing to insert ${numberRangeToInsert.toString()} ` +
`next to ${midNumberRange.toString()}`,
);
}
return isEntirelyBeforeMid ? [start, mid] : [mid + 1, end];
},
});
this.numberRanges = this.numberRanges.insert(index, numberRange);
this.values = this.values.insert(index, value);
}
getValueForNumber(number: number): T|undefined {
const index = generalUtils.binarySearch(this.numberRanges, number, {
getLength: (numberRanges) => numberRanges.size,
getNewRange: (numberRanges, number_, start, end) => {
const mid = Math.floor((start + end) / 2);
const midNumberRange = numberRanges.get(mid)!;
const isBeforeOrInMid = !midNumberRange.isEntirelyBefore(number_);
return isBeforeOrInMid ? [start, mid] : [mid + 1, end];
},
});
const numberRangeAtIndex = this.numberRanges.get(index);
if (numberRangeAtIndex !== undefined && numberRangeAtIndex.contains(number)) {
return this.values.get(index);
}
return undefined;
}
}
|