{"version":3,"file":"Guard.mjs","names":[],"sources":["../esm/Guard.js"],"sourcesContent":["import * as tsplus_module_1 from \"@fncts/base/data/Guard/definition\";\nimport * as tsplus_module_2 from \"@fncts/base/data/Either/destructors\";\nimport * as tsplus_module_3 from \"@fncts/base/data/number/instances\";\nimport * as tsplus_module_4 from \"@fncts/base/data/boolean/instances\";\nimport * as tsplus_module_5 from \"@fncts/base/data/Guard/api\";\nimport * as tsplus_module_6 from \"@fncts/base/data/bigint/instances\";\nimport * as tsplus_module_7 from \"@fncts/base/util/predicates\";\nimport * as tsplus_module_8 from \"@fncts/base/collection/immutable/Vector/api\";\nimport * as tsplus_module_9 from \"@fncts/base/data/Maybe/destructors\";\nimport { globalValue } from \"@fncts/base/data/Global\";\nimport { isRecord } from \"@fncts/base/util/predicates\";\nimport { getKeysForIndexSignature, memoize } from \"@fncts/schema/utils\";\nimport { getSearchTree } from \"./AST.js\";\nimport { parserFor } from \"./Parser.js\";\n/**\n * @tsplus getter fncts.schema.Schema is\n */\nexport function is(schema) {\n    return (input) => {\n        return guardFor(schema).is(input);\n    };\n}\nexport function guardFor(schema) {\n    return goMemo(schema.ast);\n}\nconst guardStrict = (value) => tsplus_module_1.makeGuard((inp) => inp === value);\nconst guardMemoMap = globalValue(Symbol.for(\"fncts.schema.Guard.guardMemoMap\"), () => new WeakMap());\nfunction goMemo(ast) {\n    const memo = guardMemoMap.get(ast);\n    if (memo) {\n        return memo;\n    }\n    const guard = go(ast);\n    guardMemoMap.set(ast, guard);\n    return guard;\n}\nfunction go(ast) {\n    void 0;\n    switch (ast._tag) {\n        case 0 /* ASTTag.Declaration */: {\n            const parser = parserFor(ast, true);\n            return tsplus_module_1.makeGuard((inp) => tsplus_module_2.match(() => false, () => true)(parser(inp)));\n        }\n        case 1 /* ASTTag.Literal */: {\n            return tsplus_module_1.makeGuard((inp) => inp === ast.literal);\n        }\n        case 2 /* ASTTag.UniqueSymbol */: {\n            return guardStrict(ast.symbol);\n        }\n        case 4 /* ASTTag.VoidKeyword */:\n        case 3 /* ASTTag.UndefinedKeyword */: {\n            return guardStrict(undefined);\n        }\n        case 5 /* ASTTag.NeverKeyword */: {\n            return tsplus_module_1.makeGuard((inp) => false);\n        }\n        case 6 /* ASTTag.UnknownKeyword */:\n        case 7 /* ASTTag.AnyKeyword */: {\n            return tsplus_module_1.makeGuard((inp) => true);\n        }\n        case 9 /* ASTTag.NumberKeyword */: {\n            return tsplus_module_3.Guard;\n        }\n        case 10 /* ASTTag.BooleanKeyword */: {\n            return tsplus_module_4.Guard;\n        }\n        case 8 /* ASTTag.StringKeyword */: {\n            return tsplus_module_5.string;\n        }\n        case 11 /* ASTTag.BigIntKeyword */: {\n            return tsplus_module_6.Guard;\n        }\n        case 12 /* ASTTag.SymbolKeyword */: {\n            return tsplus_module_1.makeGuard((inp) => typeof inp === \"symbol\");\n        }\n        case 13 /* ASTTag.ObjectKeyword */: {\n            return tsplus_module_1.makeGuard(tsplus_module_7.isObject);\n        }\n        case 15 /* ASTTag.TemplateLiteral */: {\n            const parser = parserFor(ast, true);\n            return tsplus_module_1.makeGuard((inp) => tsplus_module_2.match(() => false, () => true)(parser(inp)));\n        }\n        case 16 /* ASTTag.Tuple */: {\n            const elements = tsplus_module_8.map((element) => goMemo(element.type))(ast.elements);\n            const restElements = tsplus_module_9.match(() => tsplus_module_8.empty(), (rest) => tsplus_module_8.map(goMemo)(rest))(ast.rest);\n            return tsplus_module_1.makeGuard((input) => {\n                if (!Array.isArray(input)) {\n                    return false;\n                }\n                let i = 0;\n                for (; i < elements.length; i++) {\n                    if (input.length < i + 1) {\n                        if (!tsplus_module_8.unsafeGet(i)(ast.elements).isOptional) {\n                            return false;\n                        }\n                    }\n                    else {\n                        const guard = tsplus_module_8.unsafeGet(i)(elements);\n                        if (!guard.is(input[i])) {\n                            return false;\n                        }\n                    }\n                }\n                if (restElements.length > 0) {\n                    const head = tsplus_module_8.unsafeHead(restElements);\n                    const tail = tsplus_module_8.tail(restElements);\n                    for (; i < input.length - tail.length; i++) {\n                        if (!head.is(input[i])) {\n                            return false;\n                        }\n                    }\n                    for (let j = 0; j < tail.length; j++) {\n                        i += j;\n                        if (input.length < i + 1) {\n                            return false;\n                        }\n                        const guard = tsplus_module_8.unsafeGet(j)(tail);\n                        if (!guard.is(input[i])) {\n                            return false;\n                        }\n                    }\n                }\n                return true;\n            });\n        }\n        case 17 /* ASTTag.TypeLiteral */: {\n            if (ast.propertySignatures.length === 0 && ast.indexSignatures.length === 0) {\n                return tsplus_module_1.makeGuard((input) => input !== null);\n            }\n            const propertySignatureTypes = tsplus_module_8.map((ps) => goMemo(ps.type))(ast.propertySignatures);\n            const indexSignatures = tsplus_module_8.map((is) => [goMemo(is.parameter), goMemo(is.type)])(ast.indexSignatures);\n            return tsplus_module_1.makeGuard((input) => {\n                if (!isRecord(input)) {\n                    return false;\n                }\n                const expectedKeys = {};\n                console.log(ast.propertySignatures);\n                for (let i = 0; i < propertySignatureTypes.length; i++) {\n                    const ps = tsplus_module_8.unsafeGet(i)(ast.propertySignatures);\n                    const guard = tsplus_module_8.unsafeGet(i)(propertySignatureTypes);\n                    const name = ps.name;\n                    expectedKeys[name] = null;\n                    if (!Object.prototype.hasOwnProperty.call(input, name)) {\n                        if (!ps.isOptional) {\n                            return false;\n                        }\n                    }\n                    else {\n                        if (!tsplus_module_5.is(input[name])(guard)) {\n                            return false;\n                        }\n                    }\n                }\n                if (indexSignatures.length > 0) {\n                    for (let i = 0; i < indexSignatures.length; i++) {\n                        const [parameter, type] = tsplus_module_8.unsafeGet(i)(indexSignatures);\n                        const keys = getKeysForIndexSignature(input, tsplus_module_8.unsafeGet(i)(ast.indexSignatures).parameter);\n                        for (const key of keys) {\n                            if (Object.prototype.hasOwnProperty.call(expectedKeys, key)) {\n                                continue;\n                            }\n                            if (!tsplus_module_5.is(key)(parameter)) {\n                                return false;\n                            }\n                            if (!tsplus_module_5.is(input[key])(type)) {\n                                return false;\n                            }\n                        }\n                    }\n                }\n                return true;\n            });\n        }\n        case 18 /* ASTTag.Union */: {\n            const searchTree = getSearchTree(ast.types, true);\n            const ownKeys = Reflect.ownKeys(searchTree.keys);\n            const len = ownKeys.length;\n            const otherwise = searchTree.otherwise;\n            const map = new Map();\n            tsplus_module_8.forEach((ast) => {\n                map.set(ast, goMemo(ast));\n            })(ast.types);\n            return tsplus_module_1.makeGuard((input) => {\n                if (len > 0) {\n                    if (isRecord(input)) {\n                        for (let i = 0; i < len; i++) {\n                            const name = ownKeys[i];\n                            const buckets = searchTree.keys[name].buckets;\n                            if (Object.prototype.hasOwnProperty.call(input, name)) {\n                                const literal = String(input[name]);\n                                if (Object.prototype.hasOwnProperty.call(buckets, literal)) {\n                                    const bucket = buckets[literal];\n                                    for (let i = 0; i < bucket.length; i++) {\n                                        if (tsplus_module_5.is(input)(map.get(bucket[i]))) {\n                                            return true;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n                for (let i = 0; i < otherwise.length; i++) {\n                    if (tsplus_module_5.is(input)(map.get(otherwise[i]))) {\n                        return true;\n                    }\n                }\n                return false;\n            });\n        }\n        case 19 /* ASTTag.Lazy */: {\n            const f = () => goMemo(ast.getAST());\n            const get = memoize(f);\n            return tsplus_module_1.makeGuard((input) => tsplus_module_5.is(input)(get()));\n        }\n        case 14 /* ASTTag.Enum */: {\n            return tsplus_module_1.makeGuard((input) => tsplus_module_8.some(([_, value]) => value === input)(ast.enums));\n        }\n        case 20 /* ASTTag.Refinement */: {\n            const from = goMemo(ast.from);\n            return tsplus_module_1.makeGuard((input) => {\n                if (!tsplus_module_5.is(input)(from)) {\n                    return false;\n                }\n                if (!ast.predicate(input)) {\n                    return false;\n                }\n                return true;\n            });\n        }\n        case 21 /* ASTTag.Transform */: {\n            return goMemo(ast.to);\n        }\n        case 22 /* ASTTag.Validation */: {\n            const from = goMemo(ast.from);\n            return tsplus_module_1.makeGuard((input) => {\n                if (!tsplus_module_5.is(input)(from)) {\n                    return false;\n                }\n                for (const validation of ast.validation) {\n                    if (!validation.validate(input)) {\n                        return false;\n                    }\n                }\n                return true;\n            });\n        }\n    }\n}\n//# sourceMappingURL=Guard.js.map"],"mappings":"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"}