getPermutation()

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);
        }
    }