{"version":3,"file":"Eq.mjs","names":[],"sources":["../esm/Eq.js"],"sourcesContent":["import * as tsplus_module_1 from \"@fncts/base/data/Eq/api\";\nimport * as tsplus_module_2 from \"@fncts/base/collection/immutable/Vector/api\";\nimport * as tsplus_module_3 from \"@fncts/schema/ASTAnnotation\";\nimport * as tsplus_module_4 from \"@fncts/base/data/Maybe/api\";\nimport * as tsplus_module_5 from \"@fncts/base/data/Maybe/definition\";\nimport * as tsplus_module_6 from \"@fncts/base/data/Eq/definition\";\nexport const eq = eq_1;\nimport { globalValue } from \"@fncts/base/data/Global\";\nimport { getKeysForIndexSignature, memoize } from \"./utils.js\";\n/**\n * @tsplus getter fncts.schema.Schema equals\n */\nexport function equals(self) {\n    const eq = eq_1(self);\n    return (a, b) => eq.equals(b)(a);\n}\n/**\n * @tsplus getter fncts.schema.Schema eq\n */\nfunction eq_1(self) {\n    return goMemo(self.ast);\n}\nconst eqMemoMap = globalValue(Symbol.for(\"fncts.schema.Eq.eqMemoMap\"), () => new WeakMap());\nfunction goMemo(ast) {\n    const memo = eqMemoMap.get(ast);\n    if (memo) {\n        return memo;\n    }\n    const eq = go(ast);\n    eqMemoMap.set(ast, eq);\n    return eq;\n}\nfunction go(ast) {\n    void 0;\n    switch (ast._tag) {\n        case 0 /* ASTTag.Declaration */:\n            return tsplus_module_4.getOrElse(() => tsplus_module_1.strict)(tsplus_module_4.map((eq) => eq(...tsplus_module_2.map(go)(ast.typeParameters)))(ast.annotations\n                .get(tsplus_module_3.EqHook)));\n        case 1 /* ASTTag.Literal */:\n        case 2 /* ASTTag.UniqueSymbol */:\n        case 3 /* ASTTag.UndefinedKeyword */:\n        case 4 /* ASTTag.VoidKeyword */:\n        case 6 /* ASTTag.UnknownKeyword */:\n        case 7 /* ASTTag.AnyKeyword */:\n        case 9 /* ASTTag.NumberKeyword */:\n        case 10 /* ASTTag.BooleanKeyword */:\n        case 11 /* ASTTag.BigIntKeyword */:\n        case 12 /* ASTTag.SymbolKeyword */:\n        case 13 /* ASTTag.ObjectKeyword */:\n        case 15 /* ASTTag.TemplateLiteral */:\n        case 8 /* ASTTag.StringKeyword */:\n            return tsplus_module_1.strict;\n        case 5 /* ASTTag.NeverKeyword */:\n            return tsplus_module_1.never;\n        case 16 /* ASTTag.Tuple */: {\n            const elements = tsplus_module_2.map((element) => goMemo(element.type))(ast.elements);\n            const rest = tsplus_module_4.map((rest) => tsplus_module_2.map((ast) => goMemo(ast))(rest))(ast.rest);\n            return tsplus_module_6.makeEq({\n                equals: (y) => (x) => {\n                    if (x.length !== y.length) {\n                        return false;\n                    }\n                    let i = 0;\n                    for (; i < elements.length; i++) {\n                        const eq = tsplus_module_2.unsafeGet(i)(elements);\n                        const xi = x[i];\n                        const yi = y[i];\n                        if (!eq.equals(yi)(xi)) {\n                            return false;\n                        }\n                    }\n                    if (tsplus_module_5.isJust(rest)) {\n                        const head = tsplus_module_2.unsafeHead(rest.value);\n                        const tail = tsplus_module_2.tail(rest.value);\n                        for (; i < x.length - tail.length; i++) {\n                            if (!head.equals(y[i])(x[i])) {\n                                return false;\n                            }\n                        }\n                        for (let j = 0; j < tail.length; j++) {\n                            i += j;\n                            const eq = tsplus_module_2.unsafeGet(i)(elements);\n                            const xi = x[i];\n                            const yi = y[i];\n                            if (!eq.equals(yi)(xi)) {\n                                return false;\n                            }\n                        }\n                    }\n                    return true;\n                },\n            });\n        }\n        case 17 /* ASTTag.TypeLiteral */: {\n            const propertySignatureTypes = tsplus_module_2.map((ps) => go(ps.type))(ast.propertySignatures);\n            const indexSignatures = tsplus_module_2.map((is) => [go(is.parameter), go(is.type)])(ast.indexSignatures);\n            const requiredEqs = {};\n            const optionalEqs = {};\n            for (let i = 0; i < propertySignatureTypes.length; i++) {\n                const ps = tsplus_module_2.unsafeGet(i)(ast.propertySignatures);\n                const name = ps.name;\n                if (!ps.isOptional) {\n                    requiredEqs[name] = tsplus_module_2.unsafeGet(i)(propertySignatureTypes);\n                }\n                else {\n                    optionalEqs[name] = tsplus_module_2.unsafeGet(i)(propertySignatureTypes);\n                }\n            }\n            let output = tsplus_module_1.struct(requiredEqs, optionalEqs);\n            for (let i = 0; i < indexSignatures.length; i++) {\n                const [, type] = tsplus_module_2.unsafeGet(i)(indexSignatures);\n                output = tsplus_module_1.intersection(tsplus_module_6.makeEq({\n                    equals: (y) => (x) => {\n                        for (const key of getKeysForIndexSignature(x, tsplus_module_2.unsafeGet(i)(ast.indexSignatures).parameter)) {\n                            if (key in requiredEqs || key in optionalEqs) {\n                                continue;\n                            }\n                            if (!type.equals(y[key])(x[key])) {\n                                return false;\n                            }\n                        }\n                        return true;\n                    },\n                }))(output);\n            }\n            return output;\n        }\n        case 18 /* ASTTag.Union */:\n            return tsplus_module_1.union(tsplus_module_2.toArray(tsplus_module_2.map(goMemo)(ast.types)));\n        case 19 /* ASTTag.Lazy */: {\n            const f = () => goMemo(ast.getAST());\n            const get = memoize(f);\n            return tsplus_module_6.makeEq({\n                equals: (y) => (x) => get(f).equals(y)(x),\n            });\n        }\n        case 14 /* ASTTag.Enum */:\n            return tsplus_module_1.strict;\n        case 21 /* ASTTag.Transform */:\n            return goMemo(ast.to);\n        case 20 /* ASTTag.Refinement */:\n            return goMemo(ast.from);\n        case 22 /* ASTTag.Validation */:\n            return goMemo(ast.from);\n    }\n}\n//# sourceMappingURL=Eq.js.map"],"mappings":"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"}