/******************************************************************************
 * Copyright 2024 TypeFox GmbH
 * This program and the accompanying materials are made available under the
 * terms of the MIT License, which is available in the project root.
 ******************************************************************************/
export class DocumentTrie {
    constructor() {
        this.root = { children: new Map() };
    }
    clear() {
        this.root.children.clear();
    }
    insert(uri, document) {
        const node = this.getNode(uri, true);
        node.document = document;
    }
    delete(uri) {
        const lastPart = uri.substring(uri.lastIndexOf('/') + 1);
        const nodeToDelete = this.getNode(uri, false);
        if (nodeToDelete === null || nodeToDelete === void 0 ? void 0 : nodeToDelete.parent) {
            nodeToDelete.parent.children.delete(lastPart);
        }
    }
    has(uri) {
        return Boolean(this.getNode(uri, false));
    }
    find(uri) {
        var _a;
        return (_a = this.getNode(uri, false)) === null || _a === void 0 ? void 0 : _a.document;
    }
    all() {
        return this.collectDocuments(this.root);
    }
    findAll(prefix) {
        const node = this.getNode(prefix, false);
        if (!node) {
            return [];
        }
        return this.collectDocuments(node);
    }
    getNode(uri, create) {
        const parts = uri.split('/');
        let current = this.root;
        for (const part of parts) {
            let child = current.children.get(part);
            if (!child) {
                if (create) {
                    child = {
                        children: new Map(),
                        parent: current
                    };
                    current.children.set(part, child);
                }
                else {
                    return undefined;
                }
            }
            current = child;
        }
        return current;
    }
    collectDocuments(node) {
        const result = [];
        if (node.document) {
            result.push(node.document);
        }
        for (const child of node.children.values()) {
            result.push(...this.collectDocuments(child));
        }
        return result;
    }
}//# sourceMappingURL=https://main.vscode-cdn.net/sourcemaps/ecfbad74d93962fc8ca485d93ab9b4f3d4cb6cf8/node_modules/langium/lib/workspace/document-trie.js.map