import { LookupTree, FlattenedLookupTree, LookupTreeEntry, FlattenedLookupTreeEntry } from './types';

export default function flatten(tree: LookupTree): FlattenedLookupTree {
    const result: FlattenedLookupTree = {};
    for (const [glyphId, entry] of Object.entries(tree.individual)) {
        result[glyphId] = flattenEntry(entry);
    }

    for (const { range, entry } of tree.range) {
        const flattened = flattenEntry(entry);
        for (let glyphId = range[0]; glyphId < range[1]; glyphId++) {
            result[glyphId] = flattened;
        }
    }

    return result;
}

function flattenEntry(entry: LookupTreeEntry): FlattenedLookupTreeEntry {
    const result: FlattenedLookupTreeEntry = {};

    if (entry.forward) {
        result.forward = flatten(entry.forward);
    }

    if (entry.reverse) {
        result.reverse = flatten(entry.reverse);
    }

    if (entry.lookup) {
        result.lookup = entry.lookup;
    }

    return result;
}
