in packages/core/micro/src/permutation/index.ts [338:377]
getPermutation(position: number) {
if (position < 0 || position >= this.permutationTree.getLength()) {
return undefined;
}
let segment: PermutationSegment | undefined;
let offset: number;
let leaf: LeafNode<PermutationSegment>;
let index: number;
if (this.cachedSegment && position >= this.segmentStart! && position < this.segmentEnd!) {
segment = this.cachedSegment;
offset = position - this.segmentStart!;
({ index, leaf } = this.focus!);
}
else {
({ index, offset, leaf } = this.focus = this.permutationTree.zoom(position));
this.cachedSegment = segment = leaf.segments[index];
this.segmentStart = position - offset;
this.segmentEnd = this.segmentStart + leaf.lengths[index];
}
switch (segment.kind) {
case PermutationKind.Empty:
const fresh = this.freshPermutation();
const len = leaf.lengths[index];
leaf.segments[index] = this.cachedSegment = singleton(offset, len, fresh);
return fresh;
case PermutationKind.Direct:
const permutation = segment.content[offset];
if (permutation === UNALLOCATED) {
return segment.content[offset] = this.freshPermutation();
}
return permutation;
case PermutationKind.RunLength:
return getItemFromRL(segment, offset, this.freshPermutation);
}
}