Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

ts-pattern

Package Overview
Dependencies
Maintainers
1
Versions
159
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ts-pattern - npm Package Compare versions

Comparing version
5.0.3-rc.1
to
5.0.3-rc.2
+1
-1
dist/index.cjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.cjs","sources":["../src/internals/symbols.ts","../src/internals/helpers.ts","../src/is-matching.ts","../src/patterns.ts","../src/match.ts"],"sourcesContent":["/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n","/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Object.keys(pattern).every((k: string): boolean => {\n // @ts-ignore\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(\n subPattern,\n // @ts-ignore\n value[k],\n select\n )\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n","import { MatchedValue, Pattern } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p,\n value: unknown\n): value is P.infer<p>;\n\nexport function isMatching<p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n","import { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n} from './types/Pattern';\n\nexport { Pattern, Fn as unstable_Fn };\n\nexport { matcher };\n\n/**\n * @experimental\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * @experimental\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<p extends Pattern<any>> = InvertPattern<p, unknown>;\n\nexport type narrow<i, p extends Pattern<any>> = ExtractPreciseValue<\n i,\n InvertPattern<p, i>\n>;\n\nfunction chainable<p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): Chainable<p> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<p>;\n}\n\ntype Variadic<p> = p & Iterable<p>;\n\nconst variadic = <p extends {}>(pattern: p): Variadic<p> =>\n Object.assign(pattern, {\n *[Symbol.iterator]() {\n yield Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n },\n });\n\ntype ArrayChainable<p, omitted extends string = never> = Variadic<p> &\n Omit<\n {\n /**\n * `.optional()` returns a pattern which matches if the\n * key is undefined or if it is defined and the previous pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.string.optional() }, () => 'will match { greeting?: string}')\n */\n optional<input>(): ArrayChainable<\n OptionalP<input, p>,\n omitted | 'optional'\n >;\n /**\n * `P.select()` will inject this property into the handler function's arguments.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.string.select() }, (age) => 'age: number')\n */\n select<input>(): ArrayChainable<\n SelectP<symbols.anonymousSelectKey, input, p>,\n omitted | 'select'\n >;\n select<input, k extends string>(\n key: k\n ): ArrayChainable<SelectP<k, input, p>, omitted | 'select'>;\n },\n omitted\n >;\n\nfunction arrayChainable<p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): ArrayChainable<p> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const p extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: p): Chainable<OptionalP<input, p>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#Parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const p extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: p): ArrayChainable<ArrayP<input, p>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: p): Chainable<SetP<input, p>>;\nexport function set<\n input,\n const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: p]): Chainable<SetP<input, p>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#Pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const ps extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: ps): Chainable<AndP<input, ps>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#Punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const ps extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: ps): Chainable<OrP<input, ps>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<input, const p extends Pattern<input> | UnknownPattern>(\n pattern: p\n): Chainable<NotP<input, p>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#Pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, p extends (value: input) => unknown>(\n predicate: p\n): GuardP<\n input,\n p extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, p extends (value: input) => unknown>(\n predicate: p\n): GuardP<\n input,\n p extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const p extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(key: k, pattern: p): Chainable<SelectP<k, input, p>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): StringChainable<p> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **number** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const between = <\n input,\n const min extends number,\n const max extends number\n>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **number** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nexport const lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **number** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nexport const gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **number** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nexport const lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **number** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nexport const gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int, () => 'an integer')\n */\nexport const int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nexport const finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive, () => 'number > 0')\n */\nexport const positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative, () => 'number < 0')\n */\nexport const negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): NumberChainable<p> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'numbers < 10')\n */\nexport const ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintgt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'numbers > 10')\n */\nexport const gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nexport const lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nexport const gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive, () => 'bigint > 0')\n */\nexport const positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative, () => 'bigint < 0')\n */\nexport const negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): BigIntChainable<p> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#bigint-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, () => 'will match on null or undefined')\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#Pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const p extends Pattern<input>>(\n pattern: p\n): Chainable<GuardP<input, InvertPattern<p, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n","import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n patterns.push(args[0]);\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n return this.run();\n }\n\n run(): output {\n if (this.state.matched) return this.state.value;\n\n let displayedValue;\n try {\n displayedValue = JSON.stringify(this.input);\n } catch (e) {\n displayedValue = this.input;\n }\n\n throw new Error(\n `Pattern matching error: no pattern matches value ${displayedValue}`\n );\n }\n\n returnType() {\n return this;\n }\n}\n"],"names":["matcher","Symbol","isVariadic","anonymousSelectKey","isObject","value","Boolean","isMatcher","x","symbols","matchPattern","pattern","select","_matcher$match","match","matched","selections","Object","keys","forEach","key","Array","isArray","_step","startPatterns","endPatterns","variadicPatterns","_iterator","_createForOfIteratorHelperLoose","done","subpattern","push","length","Error","startValues","slice","endValues","middleValues","Infinity","every","subPattern","i","k","matcherType","is","getSelectionKeys","_pattern$symbols$matc","_pattern$symbols$matc2","_pattern$symbols$matc3","call","flatMap","values","xs","f","reduce","acc","concat","isMatching","args","arguments","chainable","assign","optional","and","p2","intersection","or","union","undefined","arrayChainable","_Object$assign2","iterator","regeneratorRuntime","mark","_callee","_Object$assign","wrap","_context","prev","next","stop","variadic","_chainable","selector","setEvery","set","predicate","mapEvery","map","_step2","_iterator2","entries","_step2$value","_chainable4","patterns","p","_chainable5","some","when","_ref","_chainable7","_selections","isNumber","isString","isBigInt","any","_","string","stringChainable","startsWith","str","start","endsWith","end","minLength","min","maxLength","max","includes","substr","regex","expr","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","number","numberChainable","betweenBigInt","ltBigInt","gtBigInt","lteBigInt","gteBigInt","positiveBigInt","negativeBigInt","bigint","bigintChainable","boolean","symbol","nullish","_arrayChainable","v","_chainable2","Set","size","_chainable3","Map","_args$","toString","patternKey","patternValue","keyMatch","valueMatch","_chainable6","classConstructor","val","isInstanceOf","unmatched","MatchExpression","input","state","this","_proto","prototype","_this","handler","apply","hasSelections","selected","otherwise","exhaustive","run","displayedValue","JSON","stringify","e","returnType"],"mappings":"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"}
{"version":3,"file":"index.cjs","sources":["../src/internals/symbols.ts","../src/internals/helpers.ts","../src/is-matching.ts","../src/patterns.ts","../src/match.ts"],"sourcesContent":["/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n","/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Object.keys(pattern).every((k: string): boolean => {\n // @ts-ignore\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(\n subPattern,\n // @ts-ignore\n value[k],\n select\n )\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n","import { MatchedValue, Pattern } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p,\n value: unknown\n): value is P.infer<p>;\n\nexport function isMatching<p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n","import { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n} from './types/Pattern';\n\nexport { Pattern, Fn as unstable_Fn };\n\nexport { matcher };\n\n/**\n * @experimental\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * @experimental\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<pattern extends Pattern<any>> = InvertPattern<\n pattern,\n unknown\n>;\n\n/**\n * `P.narrow<Input, Pattern>` will narrow the input type to only keep\n * the set of values that are compatible with the provided pattern type.\n *\n * [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnarrow)\n *\n * @example\n * type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']\n * const Pattern = ['a', P.union('a', 'b')] as const\n *\n * type Narrowed = P.narrow<Input, typeof Pattern>\n * // ^? ['a', 'a' | 'b']\n */\nexport type narrow<input, pattern extends Pattern<any>> = ExtractPreciseValue<\n input,\n InvertPattern<pattern, input>\n>;\n\nfunction chainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): Chainable<pattern> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<pattern>;\n}\n\ntype Variadic<pattern> = pattern & Iterable<pattern>;\n\nconst variadic = <pattern extends {}>(pattern: pattern): Variadic<pattern> =>\n Object.assign(pattern, {\n *[Symbol.iterator]() {\n yield Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n },\n });\n\ntype ArrayChainable<\n pattern,\n omitted extends string = never\n> = Variadic<pattern> &\n Omit<\n {\n /**\n * `.optional()` returns a pattern which matches if the\n * key is undefined or if it is defined and the previous pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.string.optional() }, () => 'will match { greeting?: string}')\n */\n optional<input>(): ArrayChainable<\n OptionalP<input, pattern>,\n omitted | 'optional'\n >;\n /**\n * `P.select()` will inject this property into the handler function's arguments.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.string.select() }, (age) => 'age: number')\n */\n select<input>(): ArrayChainable<\n SelectP<symbols.anonymousSelectKey, input, pattern>,\n omitted | 'select'\n >;\n select<input, k extends string>(\n key: k\n ): ArrayChainable<SelectP<k, input, pattern>, omitted | 'select'>;\n },\n omitted\n >;\n\nfunction arrayChainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): ArrayChainable<pattern> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#Parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: pattern): Chainable<SetP<input, pattern>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: pattern]): Chainable<SetP<input, pattern>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#Pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<AndP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#Punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<OrP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<\n input,\n const pattern extends Pattern<input> | UnknownPattern\n>(pattern: pattern): Chainable<NotP<input, pattern>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#Pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(\n key: k,\n pattern: pattern\n): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): StringChainable<pattern> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **number** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const between = <\n input,\n const min extends number,\n const max extends number\n>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **number** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nexport const lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **number** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nexport const gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **number** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nexport const lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **number** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nexport const gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int, () => 'an integer')\n */\nexport const int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nexport const finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive, () => 'number > 0')\n */\nexport const positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative, () => 'number < 0')\n */\nexport const negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): NumberChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'numbers < 10')\n */\nexport const ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintgt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'numbers > 10')\n */\nexport const gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nexport const lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nexport const gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive, () => 'bigint > 0')\n */\nexport const positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative, () => 'bigint < 0')\n */\nexport const negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): BigIntChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#bigint-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, () => 'will match on null or undefined')\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#Pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const pattern extends Pattern<input>>(\n pattern: pattern\n): Chainable<GuardP<input, InvertPattern<pattern, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n","import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n patterns.push(args[0]);\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n return this.run();\n }\n\n run(): output {\n if (this.state.matched) return this.state.value;\n\n let displayedValue;\n try {\n displayedValue = JSON.stringify(this.input);\n } catch (e) {\n displayedValue = this.input;\n }\n\n throw new Error(\n `Pattern matching error: no pattern matches value ${displayedValue}`\n );\n }\n\n returnType() {\n return this;\n }\n}\n"],"names":["matcher","Symbol","isVariadic","anonymousSelectKey","isObject","value","Boolean","isMatcher","x","symbols","matchPattern","pattern","select","_matcher$match","match","matched","selections","Object","keys","forEach","key","Array","isArray","_step","startPatterns","endPatterns","variadicPatterns","_iterator","_createForOfIteratorHelperLoose","done","subpattern","push","length","Error","startValues","slice","endValues","middleValues","Infinity","every","subPattern","i","k","matcherType","is","getSelectionKeys","_pattern$symbols$matc","_pattern$symbols$matc2","_pattern$symbols$matc3","call","flatMap","values","xs","f","reduce","acc","concat","isMatching","args","arguments","chainable","assign","optional","and","p2","intersection","or","union","undefined","arrayChainable","_Object$assign2","iterator","regeneratorRuntime","mark","_callee","_Object$assign","wrap","_context","prev","next","stop","variadic","_chainable","selector","setEvery","set","predicate","mapEvery","map","_step2","_iterator2","entries","_step2$value","_chainable4","patterns","p","_chainable5","some","when","_ref","_chainable7","_selections","isNumber","isString","isBigInt","any","_","string","stringChainable","startsWith","str","start","endsWith","end","minLength","min","maxLength","max","includes","substr","regex","expr","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","number","numberChainable","betweenBigInt","ltBigInt","gtBigInt","lteBigInt","gteBigInt","positiveBigInt","negativeBigInt","bigint","bigintChainable","boolean","symbol","nullish","_arrayChainable","v","_chainable2","Set","size","_chainable3","Map","_args$","toString","patternKey","patternValue","keyMatch","valueMatch","_chainable6","classConstructor","val","isInstanceOf","unmatched","MatchExpression","input","state","this","_proto","prototype","_this","handler","apply","hasSelections","selected","otherwise","exhaustive","run","displayedValue","JSON","stringify","e","returnType"],"mappings":"szBAeO,IAAMA,EAAUC,OAAU,IAAC,uBAMrBC,EAAaD,WAAW,0BAGxBE,EAAqB,mCCbrBC,EAAW,SAACC,GAAc,OACrCC,QAAQD,GAA0B,iBAAVA,EAAmB,EAGhCE,EAAY,SACvBC,GAGA,OADgBA,OACYC,EAC9B,EAWaC,EAAe,SAAfA,EACXC,EACAN,EACAO,GAEA,GAAIL,EAAUI,GAAU,CACtB,IACAE,EADgBF,EAAQF,KACgBK,MAAMT,GAAtCU,EAAOF,EAAPE,QAASC,EAAUH,EAAVG,WAIjB,OAHID,GAAWC,GACbC,OAAOC,KAAKF,GAAYG,QAAQ,SAACC,GAAQ,OAAAR,EAAOQ,EAAKJ,EAAWI,GAAK,GAEhEL,CACR,CAED,GAAIX,EAASO,GAAU,CACrB,IAAKP,EAASC,GAAQ,OAAO,EAG7B,GAAIgB,MAAMC,QAAQX,GAAU,CAC1B,IAAKU,MAAMC,QAAQjB,GAAQ,SAK3B,IAJA,IAI8BkB,EAJ1BC,EAAgB,GAChBC,EAAc,GACdC,EAAiC,GAErCC,EAAAC,EAAgBjB,EAAQO,UAAMK,EAAAI,KAAAE,MAAE,KACxBC,EAAanB,EADTY,EAAAlB,OAENE,EAAUuB,IAAeA,EAAWrB,GACtCiB,EAAiBK,KAAKD,GACbJ,EAAiBM,OAC1BP,EAAYM,KAAKD,GAEjBN,EAAcO,KAAKD,EAEtB,CAED,GAAIJ,EAAiBM,OAAQ,CAC3B,GAAIN,EAAiBM,OAAS,EAC5B,MAAU,IAAAC,MACoF,4FAIhG,GAAI5B,EAAM2B,OAASR,EAAcQ,OAASP,EAAYO,OACpD,OACD,EAED,IAAME,EAAc7B,EAAM8B,MAAM,EAAGX,EAAcQ,QAC3CI,EACmB,IAAvBX,EAAYO,OAAe,GAAK3B,EAAM8B,OAAOV,EAAYO,QACrDK,EAAehC,EAAM8B,MACzBX,EAAcQ,OACS,IAAvBP,EAAYO,OAAeM,UAAYb,EAAYO,QAGrD,OACER,EAAce,MAAM,SAACC,EAAYC,GAC/B,OAAA/B,EAAa8B,EAAYN,EAAYO,GAAI7B,EAAO,IAElDa,EAAYc,MAAM,SAACC,EAAYC,GAC7B,OAAA/B,EAAa8B,EAAYJ,EAAUK,GAAI7B,EAAO,KAEnB,IAA5Bc,EAAiBM,QAEdtB,EAAagB,EAAiB,GAAIW,EAAczB,GAEvD,CAED,OAAOD,EAAQqB,SAAW3B,EAAM2B,QAC5BrB,EAAQ4B,MAAM,SAACC,EAAYC,GACzB,OAAA/B,EAAa8B,EAAYnC,EAAMoC,GAAI7B,EAAO,EAGjD,CAED,OAAOK,OAAOC,KAAKP,GAAS4B,MAAM,SAACG,GAEjC,IAnFJlC,EAmFUgC,EAAa7B,EAAQ+B,GAE3B,OACGA,KAAKrC,GApFLE,EAFPC,EAsFuCgC,IApFqB,aAArChC,EAAEC,KAAmBkC,cAqFtCjC,EACE8B,EAEAnC,EAAMqC,GACN9B,EAGN,EACD,CAED,OAAOK,OAAO2B,GAAGvC,EAAOM,EAC1B,EAGakC,EAAmB,SAAnBA,EAAoBlC,OAELmC,EAAAC,EAAAC,EAD1B,OAAI5C,EAASO,GACPJ,EAAUI,GAC0CmC,OAAtDA,EAAkD,OAAlDC,GAAOC,EAAArC,EAAQF,MAAmBoC,uBAAgB,EAA3CE,EAAAE,KAAAD,IAA+CF,EAAI,GAExDzB,MAAMC,QAAQX,GAAiBuC,EAAQvC,EAASkC,GAC7CK,EAAQjC,OAAOkC,OAAOxC,GAAUkC,GAElC,EACT,EAGaK,EAAU,SACrBE,EACAC,GACQ,OAAAD,EAAGE,OAAY,SAACC,EAAK/C,UAAM+C,EAAIC,OAAOH,EAAE7C,GAAG,EAAE,GAAG,ECpG1C,SAAAiD,QACXC,KAA+BvB,MAAAc,KAAAU,WAElC,GAAoB,IAAhBD,EAAK1B,OAAc,CACrB,IAAOrB,EAAW+C,EAClB,GAAA,gBAAQrD,GAAU,OAChBK,EAAaC,EAASN,EAAO,WAAQ,EAAC,CACzC,CACD,GAAoB,IAAhBqD,EAAK1B,OAEP,OAAOtB,EADkBgD,EAAX,GAAWA,EACzB,GAAoC,WAAQ,GAG9C,UAAUzB,0FAC4EyB,EAAK1B,OAAM,IAEnG,CC0DA,SAAS4B,EACPjD,GAEA,OAAOM,OAAO4C,OAAOlD,EAAS,CAC5BmD,SAAU,kBAAMA,EAASnD,EAAQ,EACjCoD,IAAK,SAACC,UAAYC,EAAatD,EAASqD,EAAG,EAC3CE,GAAI,SAACF,GAAY,OAAAG,EAAMxD,EAASqD,EAAG,EACnCpD,OAAQ,SAACQ,eACCgD,IAARhD,EAAoBR,EAAOD,GAAWC,EAAOQ,EAAKT,EAAQ,GAEhE,CAqDA,SAAS0D,EACP1D,GAEA,OAAOM,OAAO4C,OApDC,SAAqBlD,GAAgB2D,IAAAA,SACpDrD,OAAO4C,OAAOlD,IAAO2D,MACjBrE,OAAOsE,kCAASC,OAAAA,mBAAAC,KAAA,SAAAC,IAAA,IAAAC,EAAA,OAAAH,mBAAAI,cAAAC,iBAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAChB,OADgBF,EAAAE,OACV9D,OAAO4C,OAAOlD,IAAOgE,MACxBlE,IAAqB,EAAIkE,IAC1B,KAAA,EAAA,IAAA,MAAA,OAAAE,EAAAG,SAAAN,EAAA,EAHcF,EAIlB,EAACF,GACD,CA6CmBW,CAAStE,GAAU,CACtCmD,SAAU,kBAAMO,EAAeP,EAASnD,GAAS,EACjDC,OAAQ,SAACQ,UACPiD,OACUD,IAARhD,EAAoBR,EAAOD,GAAWC,EAAOQ,EAAKT,GACnD,GAEP,CAYM,SAAUmD,EAGdnD,GAAgB,IAAAuE,EAChB,OAAOtB,IAASsB,MACblF,GAAQ,WACP,MAAO,CACLc,MAAO,SAAeT,GACpB,IAAIW,EAAwC,GACtCmE,EAAW,SAAC/D,EAAaf,GAC7BW,EAAWI,GAAOf,CACpB,EACA,YAAc+D,IAAV/D,GACFwC,EAAiBlC,GAASQ,QAAQ,SAACC,GAAG,OACpC+D,EAAS/D,OAAKgD,EAAU,GAEnB,CAAErD,SAAS,EAAMC,WAAAA,IAGnB,CAAED,QADOL,EAAaC,EAASN,EAAO8E,GAC3BnE,WAAAA,EACpB,EACA6B,iBAAkB,WAAM,OAAAA,EAAiBlC,EAAQ,EACjDgC,YAAa,WAEjB,EAACuC,GAEL,CAqHA,IAAME,EAAW,SAAIC,EAAaC,GAChC,IAAA,IAAuB/D,EAAvBI,EAAAC,EAAoByD,KAAG9D,EAAAI,KAAAE,MACrB,IAAIyD,EADU/D,EAAAlB,OAEd,OAAO,EAET,OAAO,CACT,EAkEMkF,EAAW,SACfC,EACAF,GAEA,IAAA,IAAwCG,EAAxCC,EAAA9D,EAA2B4D,EAAIG,aAASF,EAAAC,KAAA7D,MAAE,CAAA,IAAA+D,EAAAH,EAAApF,MACxC,IAAIiF,EADgBM,KAAPA,EAAEvF,IAEf,OACD,CAAA,CACD,OACF,CAAA,EAqBgB,SAAA4D,IAGO4B,IAAAA,EAAlBC,KAAkB3D,MAAAc,KAAAU,WACrB,OAAOC,IAASiC,EAAA,CAAA,GACb7F,GAAU,WAAO,MAAA,CAChBc,MAAO,SAACT,GACN,IAAIW,EAAwC,CAAA,EACtCmE,EAAW,SAAC/D,EAAaf,GAC7BW,EAAWI,GAAOf,CACpB,EAIA,MAAO,CAAEU,QAHQ+E,EAAuCvD,MAAM,SAACwD,GAC7D,OAAArF,EAAaqF,EAAG1F,EAAO8E,EAAS,GAEhBnE,WAAAA,EACpB,EACA6B,iBAAkB,WAChB,OAAAK,EAAQ4C,EAAuCjD,EAAiB,EAClEF,YAAa,MACd,EAACkD,GAEN,CAegB,SAAA1B,IAGO6B,IAAAA,EAAlBF,KAAkB3D,MAAAc,KAAAU,WACrB,OAAOC,IAASoC,EAAA,IACbhG,GAAU,WAAO,MAAA,CAChBc,MAAO,SAAeT,GACpB,IAAIW,EAAwC,CAAE,EACxCmE,EAAW,SAAC/D,EAAaf,GAC7BW,EAAWI,GAAOf,CACpB,EAQA,OAPA6C,EACE4C,EACAjD,GACA1B,QAAQ,SAACC,GAAQ,OAAA+D,EAAS/D,OAAKgD,EAAU,GAIpC,CAAErD,QAHQ+E,EAAuCG,KAAK,SAACF,GAC5D,OAAArF,EAAaqF,EAAG1F,EAAO8E,EAAS,GAEhBnE,WAAAA,EACpB,EACA6B,iBAAkB,WAAA,OAChBK,EAAQ4C,EAAuCjD,EAAiB,EAClEF,YAAa,KACd,EAACqD,GAEN,CAiDM,SAAUE,EACdZ,GAAoB,IAAAa,EAKpB,OAAAA,EAAAA,CAAAA,GACGnG,GAAU,WAAO,MAAA,CAChBc,MAAO,SAAeT,SAAiC,CACrDU,QAAST,QAAQgF,EAAUjF,IAC5B,EACF,EAAC8F,CAEN,CAmCgB,SAAAvF,IAC+CwF,IAAAA,EAA1D1C,KAA0DvB,MAAAc,KAAAU,WAEvDvC,EACe,iBAAZsC,EAAK,GAAkBA,EAAK,QAAKU,EACpCzD,EACY,IAAhB+C,EAAK1B,OACD0B,EAAK,GACc,iBAAZA,EAAK,QACZU,EACAV,EAAK,GACX,OAAOE,IAASwC,MACbpG,GAAO,WACN,MAAO,CACLc,MAAO,SAACT,GAASgG,IAAAA,EACXrF,IAAUqF,MACXjF,MAAAA,EAAAA,EAAOX,GAA6BJ,EAAKgG,GAK5C,MAAO,CACLtF,aACcqD,IAAZzD,GAEID,EAAaC,EAASN,EAPb,SAACe,EAAaf,GAC7BW,EAAWI,GAAOf,CACpB,GAMEW,WAAYA,EAEhB,EACA6B,iBAAkB,iBAChB,OAACzB,EAAAA,EAAOX,GAA4B+C,YACtBY,IAAZzD,EAAwB,GAAKkC,EAAiBlC,GAC/C,EAEP,EAACyF,GAEL,CAMA,SAASE,EAAY9F,GACnB,MAAoB,iBAANA,CAChB,CAEA,SAAS+F,EAAY/F,GACnB,MAAoB,iBAANA,CAChB,CAMA,SAASgG,EAAYhG,GACnB,MAAoB,iBAANA,CAChB,CA0BO,IAAMiG,EAAkB7C,EAAUsC,EA5CzC,SAAmB1F,GACjB,OACF,CAAA,IAsDakG,EAAID,EA6GJE,EA1BW,SAAlBC,EACJjG,GAEA,OAAAM,OAAO4C,OAAOD,EAAUjD,GAAU,CAChCkG,WAAY,SAACC,GAAW,OACtBF,EAAgB3C,EAAatD,GA3EjCoG,EA2EqDD,EAzErDZ,EAAK,SAAC7F,GAAK,OAAKkG,EAASlG,IAAUA,EAAMwG,WAAWE,EAAM,MAHzC,IACjBA,CA2E2D,EACzDC,SAAU,SAACF,UACTF,EAAgB3C,EAAatD,GA/DjCsG,EA+DmDH,EA7DnDZ,EAAK,SAAC7F,GAAK,OAAKkG,EAASlG,IAAUA,EAAM2G,SAASC,EAAI,MAHvC,IACfA,CA+DyD,EACvDC,UAAW,SAACC,GACV,OAAAP,EAAgB3C,EAAatD,EApDjB,SAA2BwG,GAC3C,OAAAjB,EAAK,SAAC7F,GAAK,OAAKkG,EAASlG,IAAUA,EAAM2B,QAAUmF,CAAG,EAAC,CAmDbD,CAAUC,IAAM,EACxDC,UAAW,SAACC,UACVT,EAAgB3C,EAAatD,EA1CjB,SAA2B0G,GAAQ,OACnDnB,EAAK,SAAC7F,GAAK,OAAKkG,EAASlG,IAAUA,EAAM2B,QAAUqF,CAAG,EAAC,CAyCbD,CAAUC,IAAM,EACxDC,SAAU,SAACR,UACTF,EAAgB3C,EAAatD,GA/BjC4G,EA+BmDT,EA7BnDZ,EAAK,SAAC7F,UAAUkG,EAASlG,IAAUA,EAAMiH,SAASC,EAAO,MAH1C,IACfA,CA+ByD,EACvDC,MAAO,SAACV,GAAgB,OAAAF,EAAgB3C,EAAatD,GAlBvD8G,EAkBsEX,EAhBtEZ,EAAK,SAAC7F,GAAK,OAAKkG,EAASlG,IAAUC,QAAQD,EAAMS,MAAM2G,GAAM,MAHjD,IACZA,CAkB4E,GACnE,CAW0Bb,CAAgBV,EAAKK,IAY7CmB,EAAU,SAKrBP,EACAE,GAAQ,OAERnB,EAAK,SAAC7F,GAAK,OAAKiG,EAASjG,IAAU8G,GAAO9G,GAASgH,GAAOhH,CAAK,EAAC,EAWrDsH,EAAK,SAChBN,GAAQ,OAERnB,EAAK,SAAC7F,UAAUiG,EAASjG,IAAUA,EAAQgH,CAAG,EAAC,EAWpCO,EAAK,SAChBT,GAEA,OAAAjB,EAAK,SAAC7F,GAAK,OAAKiG,EAASjG,IAAUA,EAAQ8G,CAAG,EAAC,EAWpCU,EAAM,SACjBR,GAEA,OAAAnB,EAAK,SAAC7F,GAAU,OAAAiG,EAASjG,IAAUA,GAASgH,CAAG,EAAC,EAWrCS,EAAM,SACjBX,GAAQ,OAERjB,EAAK,SAAC7F,GAAU,OAAAiG,EAASjG,IAAUA,GAAS8G,CAAG,EAAC,EAWrCY,EAAM,WACjB,OAAA7B,EAAK,SAAC7F,GAAU,OAAAiG,EAASjG,IAAU2H,OAAOC,UAAU5H,EAAM,EAAC,EAWhD6H,EAAS,WACpB,OAAAhC,EAAK,SAAC7F,UAAUiG,EAASjG,IAAU2H,OAAOG,SAAS9H,EAAM,EAAC,EAW/C+H,EAAW,kBACtBlC,EAAK,SAAC7F,UAAUiG,EAASjG,IAAUA,EAAQ,CAAC,EAAC,EAWlCgI,EAAW,kBACtBnC,EAAK,SAAC7F,UAAUiG,EAASjG,IAAUA,EAAQ,CAAC,EAAC,EA2BlCiI,EAzBW,SAAlBC,EACJ5H,GAEA,OAAAM,OAAO4C,OAAOD,EAAUjD,GAAU,CAChC+G,QAAS,SAACP,EAAaE,GACrB,OAAAkB,EAAgBtE,EAAatD,EAAS+G,EAAQP,EAAKE,IAAM,EAC3DM,GAAI,SAACN,GAAgB,OAAAkB,EAAgBtE,EAAatD,EAASgH,EAAGN,IAAM,EACpEO,GAAI,SAACT,GAAgB,OAAAoB,EAAgBtE,EAAatD,EAASiH,EAAGT,IAAM,EACpEU,IAAK,SAACR,GAAgB,OAAAkB,EAAgBtE,EAAatD,EAASkH,EAAIR,IAAM,EACtES,IAAK,SAACX,GAAgB,OAAAoB,EAAgBtE,EAAatD,EAASmH,EAAIX,IAAM,EACtEY,IAAK,kBAAMQ,EAAgBtE,EAAatD,EAASoH,KAAO,EACxDG,OAAQ,WAAA,OAAMK,EAAgBtE,EAAatD,EAASuH,KAAU,EAC9DE,SAAU,WAAM,OAAAG,EAAgBtE,EAAatD,EAASyH,KAAY,EAClEC,SAAU,kBAAME,EAAgBtE,EAAatD,EAAS0H,KAAY,GAC3D,CAW0BE,CAAgBrC,EAAKI,IAY7CkC,EAAgB,SAK3BrB,EACAE,GAEA,OAAAnB,EAAK,SAAC7F,GAAU,OAAAmG,EAASnG,IAAU8G,GAAO9G,GAASgH,GAAOhH,CAAK,EAAC,EAWrDoI,EAAW,SACtBpB,GAEA,OAAAnB,EAAK,SAAC7F,GAAU,OAAAmG,EAASnG,IAAUA,EAAQgH,CAAG,EAAC,EAWpCqB,EAAW,SACtBvB,GAEA,OAAAjB,EAAK,SAAC7F,GAAU,OAAAmG,EAASnG,IAAUA,EAAQ8G,CAAG,EAAC,EAWpCwB,EAAY,SACvBtB,GAEA,OAAAnB,EAAK,SAAC7F,GAAK,OAAKmG,EAASnG,IAAUA,GAASgH,CAAG,EAAC,EAWrCuB,EAAY,SACvBzB,GAEA,OAAAjB,EAAK,SAAC7F,UAAUmG,EAASnG,IAAUA,GAAS8G,CAAG,EAAC,EAWrC0B,EAAiB,WAC5B,OAAA3C,EAAK,SAAC7F,GAAK,OAAKmG,EAASnG,IAAUA,EAAQ,CAAC,EAAC,EAWlCyI,EAAiB,WAC5B,OAAA5C,EAAK,SAAC7F,GAAU,OAAAmG,EAASnG,IAAUA,EAAQ,CAAC,EAAC,EA0BlC0I,EAxBW,SAAlBC,EACJrI,UAEAM,OAAO4C,OAAOD,EAAUjD,GAAU,CAChC+G,QAAS,SAACP,EAAaE,GACrB,OAAA2B,EAAgB/E,EAAatD,EAAS6H,EAAcrB,EAAKE,IAAM,EACjEM,GAAI,SAACN,UAAgB2B,EAAgB/E,EAAatD,EAAS8H,EAASpB,IAAM,EAC1EO,GAAI,SAACT,GAAgB,OAAA6B,EAAgB/E,EAAatD,EAAS+H,EAASvB,IAAM,EAC1EU,IAAK,SAACR,GAAW,OACf2B,EAAgB/E,EAAatD,EAASgI,EAAUtB,IAAM,EACxDS,IAAK,SAACX,UACJ6B,EAAgB/E,EAAatD,EAASiI,EAAUzB,IAAM,EACxDiB,SAAU,WAAM,OAAAY,EAAgB/E,EAAatD,EAASkI,KAAkB,EACxER,SAAU,WAAA,OAAMW,EAAgB/E,EAAatD,EAASmI,KAAkB,GACjE,CAU0BE,CAAgB9C,EAAKM,IAU7CyC,EAA0BrF,EAAUsC,EAxbjD,SAAsB1F,GACpB,MAAoB,kBAANA,CAChB,IAgca0I,EAAwBtF,EAAUsC,EA1b/C,SAAqB1F,GACnB,MAAoB,iBAANA,CAChB,IAkca2I,EAA0BvF,EAAUsC,EAhcjD,SAAsB1F,GACpB,OAAOA,OACT,iDA9ZgB,WACU4I,IAAAA,EAArB1F,KAAqBvB,MAAAc,KAAAU,WAExB,OAAOU,IAAc+E,EAAA,CAAA,GAClBpJ,cACC,MAAO,CACLc,MAAO,SAACT,GACN,IAAKgB,MAAMC,QAAQjB,GAAQ,MAAO,CAAEU,SAAS,GAE7C,GAAoB,IAAhB2C,EAAK1B,OAAc,MAAO,CAAEjB,SAAS,GAEzC,IAAMJ,EAAU+C,EAAK,GACjB1C,EAAwC,GAE5C,GAAqB,IAAjBX,EAAM2B,OAIR,OAHAa,EAAiBlC,GAASQ,QAAQ,SAACC,GACjCJ,EAAWI,GAAO,EACpB,GACO,CAAEL,SAAS,EAAMC,WAAAA,GAG1B,IAAMmE,EAAW,SAAC/D,EAAaf,GAC7BW,EAAWI,IAAQJ,EAAWI,IAAQ,IAAIoC,OAAO,CAACnD,GACpD,EAMA,MAAO,CAAEU,QAJOV,EAAMkC,MAAM,SAAC8G,GAAC,OAC5B3I,EAAaC,EAAS0I,EAAGlE,EAAS,GAGlBnE,WAAAA,EACpB,EACA6B,iBAAkB,WAChB,OAAgB,IAAhBa,EAAK1B,OAAe,GAAKa,EAAiBa,EAAK,GAAG,EAExD,EAAC0F,GAEL,MAiBgB,WAGcE,IAAAA,EAAzB5F,KAAyBvB,MAAAc,KAAAU,WAC5B,OAAOC,IAAS0F,EAAA,CAAA,GACbtJ,cACC,MAAO,CACLc,MAAO,SAAeT,GACpB,KAAMA,aAAiBkJ,KAAM,MAAO,CAAExI,SAAS,GAE/C,IAAIC,EAAwC,CAAE,EAE9C,GAAmB,IAAfX,EAAMmJ,KACR,MAAO,CAAEzI,SAAS,EAAMC,WAAAA,GAG1B,GAAoB,IAAhB0C,EAAK1B,OAAc,MAAO,CAAEjB,SAAS,GAEzC,IAAMoE,EAAW,SAAC/D,EAAaf,GAC7BW,EAAWI,IAAQJ,EAAWI,IAAQ,IAAIoC,OAAO,CAACnD,GACpD,EAEMM,EAAU+C,EAAK,GAMrB,MAAO,CAAE3C,QAJOqE,EAAS/E,EAAO,SAACgJ,GAC/B,OAAA3I,EAAaC,EAAS0I,EAAGlE,EAAS,GAGlBnE,WAAAA,EACpB,EACA6B,iBAAkB,WAChB,OAAgB,IAAhBa,EAAK1B,OAAe,GAAKa,EAAiBa,EAAK,GAAG,EAExD,EAAC4F,GAEL,MA0BgB,WAKqCG,IAAAA,EAAhD/F,KAAgDvB,MAAAc,KAAAU,WAEnD,OAAOC,IAAS6F,EAAAA,CAAAA,GACbzJ,cACC,MAAO,CACLc,MAAO,SAAeT,GACpB,KAAMA,aAAiBqJ,KAAM,MAAO,CAAE3I,SAAS,GAE/C,IAAIC,EAAwC,CAAA,EAE5C,GAAmB,IAAfX,EAAMmJ,KACR,MAAO,CAAEzI,SAAS,EAAMC,WAAAA,GAG1B,IAKuB2I,EALjBxE,EAAW,SAAC/D,EAAaf,GAC7BW,EAAWI,IAAQJ,EAAWI,IAAQ,IAAIoC,OAAO,CAACnD,GACpD,EAEA,GAAoB,IAAhBqD,EAAK1B,OAAc,MAAO,CAAEjB,SAAS,GACzC,GAAoB,IAAhB2C,EAAK1B,OACP,MAAU,IAAAC,MAAK0H,2EACuE,OADvEA,EACgEjG,EAAK,SAAE,EAAPiG,EAASC,aAG1F,IAAOC,EAA4BnG,KAAhBoG,EAAgBpG,EAEnC,GAMA,MAAO,CAAE3C,QANOwE,EAASlF,EAAO,SAACgJ,EAAG3G,GAClC,IAAMqH,EAAWrJ,EAAamJ,EAAYnH,EAAGyC,GACvC6E,EAAatJ,EAAaoJ,EAAcT,EAAGlE,GACjD,OAAO4E,GAAYC,CACrB,GAEkBhJ,WAAAA,EACpB,EACA6B,iBAAkB,kBACA,IAAhBa,EAAK1B,OACD,MAAEwB,OACEX,EAAiBa,EAAK,IAAQb,EAAiBa,EAAK,IAAI,EAEtE,EAAC+F,GAEL,6BA2GgB,SAGd9I,OAAgBsJ,EAChB,OAAOrG,IAASqG,EAAA,CAAA,GACbjK,GAAU,iBAAO,CAChBc,MAAO,SAAeT,GAAiC,MAAA,CACrDU,SAAUL,EAAaC,EAASN,EAAO,WAAQ,GAChD,EACDwC,iBAAkB,WAAM,MAAA,EAAE,EAC1BF,YAAa,MACd,EAACsH,GAEN,oQA8kBgB,SACdC,GAEA,OAAOtG,EAAUsC,EAvcnB,SAAgDgE,GAC9C,OAAO,SAACC,GAAY,OAClBA,aAAeD,CAAgB,CACnC,CAocwBE,CAAaF,IACrC,iBAmBsBvJ,GACpB,OAAOiD,EAAUsC,EAAKzC,EAAW9C,IACnC,GClnCM0J,EAA+B,CACnCtJ,SAAS,EACTV,WAAO+D,GAkCHkG,eAAe,WACnB,SAAAA,EAAoBC,EAAsBC,GAAtBD,KAAAA,WAAsBC,EAAAA,KAAAA,WAAtB,EAAAC,KAAKF,MAALA,EAAsBE,KAAKD,MAALA,CAA4B,CAAC,IAAAE,EAAAJ,EAAAK,iBAAAD,EAEvE,KAAA,WAAmBE,IAAAA,EAAXH,KAAA/G,EAAW,GAAAvB,MAAAc,KAAAU,WACjB,GAAI8G,KAAKD,MAAMzJ,QAAS,OAAO0J,KAE/B,IAAMI,EACJnH,EAAKA,EAAK1B,OAAS,GAEf8D,EAA6B,CAACpC,EAAK,IACrC4B,OAAqDlB,EAErC,IAAhBV,EAAK1B,QAAmC,mBAAZ0B,EAAK,IAEnCoC,EAAS/D,KAAK2B,EAAK,IACnB4B,EAAY5B,EAAK,IACRA,EAAK1B,OAAS,GAEvB8D,EAAS/D,KAAI+I,MAAbhF,EAAiBpC,EAAKvB,MAAM,EAAGuB,EAAK1B,OAAS,IAG/C,IAAI+I,GAAgB,EAChBC,EAAoC,CAAA,EAClCpK,EAAS,SAACQ,EAAaf,GAC3B0K,GAAgB,EAChBC,EAAS5J,GAAOf,CAClB,EAYMmK,GATJ1E,EAASG,KAAK,SAACtF,GAAY,OAAAD,EAAaC,EAASiK,EAAKL,MAAO3J,EAAO,IACnE0E,IAAYhF,QAAQgF,EAAUmF,KAAKF,QAalCF,EAJA,CACEtJ,SAAS,EACTV,MAAOwK,EATME,EACftK,KAA8BuK,EAC5BA,EAASvK,GACTuK,EACFP,KAAKF,MAKwBE,KAAKF,QAItC,OAAW,IAAAD,EAAgBG,KAAKF,MAAOC,EACzC,EAACE,EAEDxE,KAAA,SACEZ,EACAuF,GAEA,GAAIJ,KAAKD,MAAMzJ,QAAS,OAAO0J,KAE/B,IAAM1J,EAAUT,QAAQgF,EAAUmF,KAAKF,QAEvC,OAAO,IAAID,EACTG,KAAKF,MACLxJ,EACI,CAAEA,SAAS,EAAMV,MAAOwK,EAAQJ,KAAKF,MAAOE,KAAKF,QACjDF,EAER,EAACK,EAEDO,UAAA,SAAUJ,GACR,OAAIJ,KAAKD,MAAMzJ,QAAgB0J,KAAKD,MAAMnK,MACnCwK,EAAQJ,KAAKF,MACtB,EAACG,EAEDQ,WAAA,WACE,OAAOT,KAAKU,KACd,EAACT,EAEDS,IAAA,WACE,GAAIV,KAAKD,MAAMzJ,QAAS,OAAO0J,KAAKD,MAAMnK,MAE1C,IAAI+K,EACJ,IACEA,EAAiBC,KAAKC,UAAUb,KAAKF,MACtC,CAAC,MAAOgB,GACPH,EAAiBX,KAAKF,KACvB,CAED,MAAU,IAAAtI,MAC4CmJ,oDAAAA,EAExD,EAACV,EAEDc,WAAA,WACE,OACFf,IAAA,EAACH,CAAA,CA1FkB,oEAfL,SACdjK,GAEA,OAAO,IAAIiK,EAAgBjK,EAAOgK,EACpC"}

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../src/internals/symbols.ts","../src/internals/helpers.ts","../src/is-matching.ts","../src/patterns.ts","../src/match.ts"],"sourcesContent":["/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n","/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Object.keys(pattern).every((k: string): boolean => {\n // @ts-ignore\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(\n subPattern,\n // @ts-ignore\n value[k],\n select\n )\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n","import { MatchedValue, Pattern } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p,\n value: unknown\n): value is P.infer<p>;\n\nexport function isMatching<p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n","import { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n} from './types/Pattern';\n\nexport { Pattern, Fn as unstable_Fn };\n\nexport { matcher };\n\n/**\n * @experimental\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * @experimental\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<p extends Pattern<any>> = InvertPattern<p, unknown>;\n\nexport type narrow<i, p extends Pattern<any>> = ExtractPreciseValue<\n i,\n InvertPattern<p, i>\n>;\n\nfunction chainable<p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): Chainable<p> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<p>;\n}\n\ntype Variadic<p> = p & Iterable<p>;\n\nconst variadic = <p extends {}>(pattern: p): Variadic<p> =>\n Object.assign(pattern, {\n *[Symbol.iterator]() {\n yield Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n },\n });\n\ntype ArrayChainable<p, omitted extends string = never> = Variadic<p> &\n Omit<\n {\n /**\n * `.optional()` returns a pattern which matches if the\n * key is undefined or if it is defined and the previous pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.string.optional() }, () => 'will match { greeting?: string}')\n */\n optional<input>(): ArrayChainable<\n OptionalP<input, p>,\n omitted | 'optional'\n >;\n /**\n * `P.select()` will inject this property into the handler function's arguments.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.string.select() }, (age) => 'age: number')\n */\n select<input>(): ArrayChainable<\n SelectP<symbols.anonymousSelectKey, input, p>,\n omitted | 'select'\n >;\n select<input, k extends string>(\n key: k\n ): ArrayChainable<SelectP<k, input, p>, omitted | 'select'>;\n },\n omitted\n >;\n\nfunction arrayChainable<p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): ArrayChainable<p> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const p extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: p): Chainable<OptionalP<input, p>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#Parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const p extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: p): ArrayChainable<ArrayP<input, p>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: p): Chainable<SetP<input, p>>;\nexport function set<\n input,\n const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: p]): Chainable<SetP<input, p>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#Pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const ps extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: ps): Chainable<AndP<input, ps>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#Punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const ps extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: ps): Chainable<OrP<input, ps>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<input, const p extends Pattern<input> | UnknownPattern>(\n pattern: p\n): Chainable<NotP<input, p>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#Pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, p extends (value: input) => unknown>(\n predicate: p\n): GuardP<\n input,\n p extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, p extends (value: input) => unknown>(\n predicate: p\n): GuardP<\n input,\n p extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const p extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(key: k, pattern: p): Chainable<SelectP<k, input, p>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): StringChainable<p> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **number** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const between = <\n input,\n const min extends number,\n const max extends number\n>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **number** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nexport const lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **number** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nexport const gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **number** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nexport const lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **number** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nexport const gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int, () => 'an integer')\n */\nexport const int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nexport const finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive, () => 'number > 0')\n */\nexport const positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative, () => 'number < 0')\n */\nexport const negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): NumberChainable<p> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'numbers < 10')\n */\nexport const ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintgt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'numbers > 10')\n */\nexport const gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nexport const lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nexport const gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive, () => 'bigint > 0')\n */\nexport const positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative, () => 'bigint < 0')\n */\nexport const negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): BigIntChainable<p> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#bigint-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, () => 'will match on null or undefined')\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#Pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const p extends Pattern<input>>(\n pattern: p\n): Chainable<GuardP<input, InvertPattern<p, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n","import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n patterns.push(args[0]);\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n return this.run();\n }\n\n run(): output {\n if (this.state.matched) return this.state.value;\n\n let displayedValue;\n try {\n displayedValue = JSON.stringify(this.input);\n } catch (e) {\n displayedValue = this.input;\n }\n\n throw new Error(\n `Pattern matching error: no pattern matches value ${displayedValue}`\n );\n }\n\n returnType() {\n return this;\n }\n}\n"],"names":["matcher","Symbol","for","isVariadic","anonymousSelectKey","isObject","value","Boolean","isMatcher","x","symbols","matchPattern","pattern","select","matched","selections","match","Object","keys","forEach","key","Array","isArray","startPatterns","endPatterns","variadicPatterns","i","subpattern","push","length","Error","startValues","slice","endValues","middleValues","Infinity","every","subPattern","k","matcherType","is","getSelectionKeys","_pattern$symbols$matc","_pattern$symbols$matc2","_pattern$symbols$matc3","call","flatMap","values","xs","f","reduce","acc","concat","isMatching","args","chainable","assign","optional","and","p2","intersection","or","union","undefined","arrayChainable","iterator","variadic","selector","setEvery","set","predicate","mapEvery","map","entries","patterns","p","some","when","isNumber","isString","isBigInt","any","_","stringChainable","startsWith","str","start","endsWith","end","minLength","min","maxLength","max","includes","substr","regex","expr","string","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","numberChainable","number","betweenBigInt","ltBigInt","gtBigInt","lteBigInt","gteBigInt","positiveBigInt","negativeBigInt","bigintChainable","bigint","boolean","symbol","nullish","v","Set","size","Map","_args$","toString","patternKey","patternValue","keyMatch","valueMatch","classConstructor","val","isInstanceOf","unmatched","MatchExpression","constructor","input","state","this","with","handler","hasSelections","selected","otherwise","exhaustive","run","displayedValue","JSON","stringify","e","returnType"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../src/internals/symbols.ts","../src/internals/helpers.ts","../src/is-matching.ts","../src/patterns.ts","../src/match.ts"],"sourcesContent":["/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n","/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Object.keys(pattern).every((k: string): boolean => {\n // @ts-ignore\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(\n subPattern,\n // @ts-ignore\n value[k],\n select\n )\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n","import { MatchedValue, Pattern } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p,\n value: unknown\n): value is P.infer<p>;\n\nexport function isMatching<p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n","import { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n} from './types/Pattern';\n\nexport { Pattern, Fn as unstable_Fn };\n\nexport { matcher };\n\n/**\n * @experimental\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * @experimental\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<pattern extends Pattern<any>> = InvertPattern<\n pattern,\n unknown\n>;\n\n/**\n * `P.narrow<Input, Pattern>` will narrow the input type to only keep\n * the set of values that are compatible with the provided pattern type.\n *\n * [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnarrow)\n *\n * @example\n * type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']\n * const Pattern = ['a', P.union('a', 'b')] as const\n *\n * type Narrowed = P.narrow<Input, typeof Pattern>\n * // ^? ['a', 'a' | 'b']\n */\nexport type narrow<input, pattern extends Pattern<any>> = ExtractPreciseValue<\n input,\n InvertPattern<pattern, input>\n>;\n\nfunction chainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): Chainable<pattern> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<pattern>;\n}\n\ntype Variadic<pattern> = pattern & Iterable<pattern>;\n\nconst variadic = <pattern extends {}>(pattern: pattern): Variadic<pattern> =>\n Object.assign(pattern, {\n *[Symbol.iterator]() {\n yield Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n },\n });\n\ntype ArrayChainable<\n pattern,\n omitted extends string = never\n> = Variadic<pattern> &\n Omit<\n {\n /**\n * `.optional()` returns a pattern which matches if the\n * key is undefined or if it is defined and the previous pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.string.optional() }, () => 'will match { greeting?: string}')\n */\n optional<input>(): ArrayChainable<\n OptionalP<input, pattern>,\n omitted | 'optional'\n >;\n /**\n * `P.select()` will inject this property into the handler function's arguments.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.string.select() }, (age) => 'age: number')\n */\n select<input>(): ArrayChainable<\n SelectP<symbols.anonymousSelectKey, input, pattern>,\n omitted | 'select'\n >;\n select<input, k extends string>(\n key: k\n ): ArrayChainable<SelectP<k, input, pattern>, omitted | 'select'>;\n },\n omitted\n >;\n\nfunction arrayChainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): ArrayChainable<pattern> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#Parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: pattern): Chainable<SetP<input, pattern>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: pattern]): Chainable<SetP<input, pattern>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#Pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<AndP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#Punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<OrP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<\n input,\n const pattern extends Pattern<input> | UnknownPattern\n>(pattern: pattern): Chainable<NotP<input, pattern>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#Pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(\n key: k,\n pattern: pattern\n): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): StringChainable<pattern> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **number** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const between = <\n input,\n const min extends number,\n const max extends number\n>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **number** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nexport const lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **number** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nexport const gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **number** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nexport const lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **number** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nexport const gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int, () => 'an integer')\n */\nexport const int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nexport const finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive, () => 'number > 0')\n */\nexport const positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative, () => 'number < 0')\n */\nexport const negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): NumberChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'numbers < 10')\n */\nexport const ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintgt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'numbers > 10')\n */\nexport const gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nexport const lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nexport const gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive, () => 'bigint > 0')\n */\nexport const positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative, () => 'bigint < 0')\n */\nexport const negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): BigIntChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#bigint-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, () => 'will match on null or undefined')\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#Pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const pattern extends Pattern<input>>(\n pattern: pattern\n): Chainable<GuardP<input, InvertPattern<pattern, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n","import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n patterns.push(args[0]);\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n return this.run();\n }\n\n run(): output {\n if (this.state.matched) return this.state.value;\n\n let displayedValue;\n try {\n displayedValue = JSON.stringify(this.input);\n } catch (e) {\n displayedValue = this.input;\n }\n\n throw new Error(\n `Pattern matching error: no pattern matches value ${displayedValue}`\n );\n }\n\n returnType() {\n return this;\n }\n}\n"],"names":["matcher","Symbol","for","isVariadic","anonymousSelectKey","isObject","value","Boolean","isMatcher","x","symbols","matchPattern","pattern","select","matched","selections","match","Object","keys","forEach","key","Array","isArray","startPatterns","endPatterns","variadicPatterns","i","subpattern","push","length","Error","startValues","slice","endValues","middleValues","Infinity","every","subPattern","k","matcherType","is","getSelectionKeys","_pattern$symbols$matc","_pattern$symbols$matc2","_pattern$symbols$matc3","call","flatMap","values","xs","f","reduce","acc","concat","isMatching","args","chainable","assign","optional","and","p2","intersection","or","union","undefined","arrayChainable","iterator","variadic","selector","setEvery","set","predicate","mapEvery","map","entries","patterns","p","some","when","isNumber","isString","isBigInt","any","_","stringChainable","startsWith","str","start","endsWith","end","minLength","min","maxLength","max","includes","substr","regex","expr","string","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","numberChainable","number","betweenBigInt","ltBigInt","gtBigInt","lteBigInt","gteBigInt","positiveBigInt","negativeBigInt","bigintChainable","bigint","boolean","symbol","nullish","v","Set","size","Map","_args$","toString","patternKey","patternValue","keyMatch","valueMatch","classConstructor","val","isInstanceOf","unmatched","MatchExpression","constructor","input","state","this","with","handler","hasSelections","selected","otherwise","exhaustive","run","displayedValue","JSON","stringify","e","returnType"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"index.umd.js","sources":["../src/internals/symbols.ts","../src/internals/helpers.ts","../src/is-matching.ts","../src/patterns.ts","../src/match.ts"],"sourcesContent":["/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n","/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Object.keys(pattern).every((k: string): boolean => {\n // @ts-ignore\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(\n subPattern,\n // @ts-ignore\n value[k],\n select\n )\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n","import { MatchedValue, Pattern } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p,\n value: unknown\n): value is P.infer<p>;\n\nexport function isMatching<p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n","import { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n} from './types/Pattern';\n\nexport { Pattern, Fn as unstable_Fn };\n\nexport { matcher };\n\n/**\n * @experimental\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * @experimental\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<p extends Pattern<any>> = InvertPattern<p, unknown>;\n\nexport type narrow<i, p extends Pattern<any>> = ExtractPreciseValue<\n i,\n InvertPattern<p, i>\n>;\n\nfunction chainable<p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): Chainable<p> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<p>;\n}\n\ntype Variadic<p> = p & Iterable<p>;\n\nconst variadic = <p extends {}>(pattern: p): Variadic<p> =>\n Object.assign(pattern, {\n *[Symbol.iterator]() {\n yield Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n },\n });\n\ntype ArrayChainable<p, omitted extends string = never> = Variadic<p> &\n Omit<\n {\n /**\n * `.optional()` returns a pattern which matches if the\n * key is undefined or if it is defined and the previous pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.string.optional() }, () => 'will match { greeting?: string}')\n */\n optional<input>(): ArrayChainable<\n OptionalP<input, p>,\n omitted | 'optional'\n >;\n /**\n * `P.select()` will inject this property into the handler function's arguments.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.string.select() }, (age) => 'age: number')\n */\n select<input>(): ArrayChainable<\n SelectP<symbols.anonymousSelectKey, input, p>,\n omitted | 'select'\n >;\n select<input, k extends string>(\n key: k\n ): ArrayChainable<SelectP<k, input, p>, omitted | 'select'>;\n },\n omitted\n >;\n\nfunction arrayChainable<p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): ArrayChainable<p> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const p extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: p): Chainable<OptionalP<input, p>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#Parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const p extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: p): ArrayChainable<ArrayP<input, p>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: p): Chainable<SetP<input, p>>;\nexport function set<\n input,\n const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: p]): Chainable<SetP<input, p>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#Pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const ps extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: ps): Chainable<AndP<input, ps>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#Punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const ps extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: ps): Chainable<OrP<input, ps>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<input, const p extends Pattern<input> | UnknownPattern>(\n pattern: p\n): Chainable<NotP<input, p>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#Pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, p extends (value: input) => unknown>(\n predicate: p\n): GuardP<\n input,\n p extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, p extends (value: input) => unknown>(\n predicate: p\n): GuardP<\n input,\n p extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const p extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(key: k, pattern: p): Chainable<SelectP<k, input, p>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): StringChainable<p> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **number** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const between = <\n input,\n const min extends number,\n const max extends number\n>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **number** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nexport const lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **number** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nexport const gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **number** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nexport const lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **number** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nexport const gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int, () => 'an integer')\n */\nexport const int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nexport const finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive, () => 'number > 0')\n */\nexport const positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative, () => 'number < 0')\n */\nexport const negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): NumberChainable<p> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'numbers < 10')\n */\nexport const ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintgt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'numbers > 10')\n */\nexport const gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nexport const lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nexport const gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive, () => 'bigint > 0')\n */\nexport const positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative, () => 'bigint < 0')\n */\nexport const negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <p extends Matcher<any, any, any, any, any>>(\n pattern: p\n): BigIntChainable<p> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#bigint-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, () => 'will match on null or undefined')\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#Pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const p extends Pattern<input>>(\n pattern: p\n): Chainable<GuardP<input, InvertPattern<p, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n","import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n patterns.push(args[0]);\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n return this.run();\n }\n\n run(): output {\n if (this.state.matched) return this.state.value;\n\n let displayedValue;\n try {\n displayedValue = JSON.stringify(this.input);\n } catch (e) {\n displayedValue = this.input;\n }\n\n throw new Error(\n `Pattern matching error: no pattern matches value ${displayedValue}`\n );\n }\n\n returnType() {\n return this;\n }\n}\n"],"names":["matcher","Symbol","isVariadic","anonymousSelectKey","isObject","value","Boolean","isMatcher","x","symbols","matchPattern","pattern","select","_matcher$match","match","matched","selections","Object","keys","forEach","key","Array","isArray","_step","startPatterns","endPatterns","variadicPatterns","_iterator","_createForOfIteratorHelperLoose","done","subpattern","push","length","Error","startValues","slice","endValues","middleValues","Infinity","every","subPattern","i","k","matcherType","is","getSelectionKeys","_pattern$symbols$matc","_pattern$symbols$matc2","_pattern$symbols$matc3","call","flatMap","values","xs","f","reduce","acc","concat","isMatching","args","arguments","chainable","assign","optional","and","p2","intersection","or","union","undefined","arrayChainable","_Object$assign2","iterator","regeneratorRuntime","mark","_callee","_Object$assign","wrap","_context","prev","next","stop","variadic","_chainable","selector","setEvery","set","predicate","mapEvery","map","_step2","_iterator2","entries","_step2$value","_chainable4","patterns","p","_chainable5","some","when","_ref","_chainable7","_selections","isNumber","isString","isBigInt","any","_","string","stringChainable","startsWith","str","start","endsWith","end","minLength","min","maxLength","max","includes","substr","regex","expr","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","number","numberChainable","betweenBigInt","ltBigInt","gtBigInt","lteBigInt","gteBigInt","positiveBigInt","negativeBigInt","bigint","bigintChainable","boolean","symbol","nullish","_arrayChainable","v","_chainable2","Set","size","_chainable3","Map","_args$","toString","patternKey","patternValue","keyMatch","valueMatch","_chainable6","classConstructor","val","isInstanceOf","unmatched","MatchExpression","input","state","this","_proto","prototype","_this","handler","apply","hasSelections","selected","otherwise","exhaustive","run","displayedValue","JSON","stringify","e","returnType"],"mappings":"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"}
{"version":3,"file":"index.umd.js","sources":["../src/internals/symbols.ts","../src/internals/helpers.ts","../src/is-matching.ts","../src/patterns.ts","../src/match.ts"],"sourcesContent":["/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n","/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Object.keys(pattern).every((k: string): boolean => {\n // @ts-ignore\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(\n subPattern,\n // @ts-ignore\n value[k],\n select\n )\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n","import { MatchedValue, Pattern } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<p extends Pattern<unknown>>(\n pattern: p,\n value: unknown\n): value is P.infer<p>;\n\nexport function isMatching<p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n","import { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n} from './types/Pattern';\n\nexport { Pattern, Fn as unstable_Fn };\n\nexport { matcher };\n\n/**\n * @experimental\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * @experimental\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * Note that this api is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<pattern extends Pattern<any>> = InvertPattern<\n pattern,\n unknown\n>;\n\n/**\n * `P.narrow<Input, Pattern>` will narrow the input type to only keep\n * the set of values that are compatible with the provided pattern type.\n *\n * [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnarrow)\n *\n * @example\n * type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']\n * const Pattern = ['a', P.union('a', 'b')] as const\n *\n * type Narrowed = P.narrow<Input, typeof Pattern>\n * // ^? ['a', 'a' | 'b']\n */\nexport type narrow<input, pattern extends Pattern<any>> = ExtractPreciseValue<\n input,\n InvertPattern<pattern, input>\n>;\n\nfunction chainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): Chainable<pattern> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<pattern>;\n}\n\ntype Variadic<pattern> = pattern & Iterable<pattern>;\n\nconst variadic = <pattern extends {}>(pattern: pattern): Variadic<pattern> =>\n Object.assign(pattern, {\n *[Symbol.iterator]() {\n yield Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n },\n });\n\ntype ArrayChainable<\n pattern,\n omitted extends string = never\n> = Variadic<pattern> &\n Omit<\n {\n /**\n * `.optional()` returns a pattern which matches if the\n * key is undefined or if it is defined and the previous pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.string.optional() }, () => 'will match { greeting?: string}')\n */\n optional<input>(): ArrayChainable<\n OptionalP<input, pattern>,\n omitted | 'optional'\n >;\n /**\n * `P.select()` will inject this property into the handler function's arguments.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.string.select() }, (age) => 'age: number')\n */\n select<input>(): ArrayChainable<\n SelectP<symbols.anonymousSelectKey, input, pattern>,\n omitted | 'select'\n >;\n select<input, k extends string>(\n key: k\n ): ArrayChainable<SelectP<k, input, pattern>, omitted | 'select'>;\n },\n omitted\n >;\n\nfunction arrayChainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): ArrayChainable<pattern> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#Poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#Parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: pattern): Chainable<SetP<input, pattern>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: pattern]): Chainable<SetP<input, pattern>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#Pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#Pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<AndP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#Punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<OrP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<\n input,\n const pattern extends Pattern<input> | UnknownPattern\n>(pattern: pattern): Chainable<NotP<input, pattern>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#Pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#Pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(\n key: k,\n pattern: pattern\n): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#P_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#PstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): StringChainable<pattern> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#Pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **number** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const between = <\n input,\n const min extends number,\n const max extends number\n>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **number** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nexport const lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **number** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nexport const gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **number** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nexport const lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **number** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nexport const gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int, () => 'an integer')\n */\nexport const int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nexport const finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive, () => 'number > 0')\n */\nexport const positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative, () => 'number < 0')\n */\nexport const negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): NumberChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= numbers <= 10')\n */\nexport const betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'numbers < 10')\n */\nexport const ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintgt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'numbers > 10')\n */\nexport const gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#bigintlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nexport const lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nexport const gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive, () => 'bigint > 0')\n */\nexport const positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative` on GitHub](https://github.com/gvergnaud/ts-pattern#Pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative, () => 'bigint < 0')\n */\nexport const negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): BigIntChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#bigint-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, () => 'will match on null or undefined')\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#Pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#Pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const pattern extends Pattern<input>>(\n pattern: pattern\n): Chainable<GuardP<input, InvertPattern<pattern, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n","import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n patterns.push(args[0]);\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n return this.run();\n }\n\n run(): output {\n if (this.state.matched) return this.state.value;\n\n let displayedValue;\n try {\n displayedValue = JSON.stringify(this.input);\n } catch (e) {\n displayedValue = this.input;\n }\n\n throw new Error(\n `Pattern matching error: no pattern matches value ${displayedValue}`\n );\n }\n\n returnType() {\n return this;\n }\n}\n"],"names":["matcher","Symbol","isVariadic","anonymousSelectKey","isObject","value","Boolean","isMatcher","x","symbols","matchPattern","pattern","select","_matcher$match","match","matched","selections","Object","keys","forEach","key","Array","isArray","_step","startPatterns","endPatterns","variadicPatterns","_iterator","_createForOfIteratorHelperLoose","done","subpattern","push","length","Error","startValues","slice","endValues","middleValues","Infinity","every","subPattern","i","k","matcherType","is","getSelectionKeys","_pattern$symbols$matc","_pattern$symbols$matc2","_pattern$symbols$matc3","call","flatMap","values","xs","f","reduce","acc","concat","isMatching","args","arguments","chainable","assign","optional","and","p2","intersection","or","union","undefined","arrayChainable","_Object$assign2","iterator","regeneratorRuntime","mark","_callee","_Object$assign","wrap","_context","prev","next","stop","variadic","_chainable","selector","setEvery","set","predicate","mapEvery","map","_step2","_iterator2","entries","_step2$value","_chainable4","patterns","p","_chainable5","some","when","_ref","_chainable7","_selections","isNumber","isString","isBigInt","any","_","string","stringChainable","startsWith","str","start","endsWith","end","minLength","min","maxLength","max","includes","substr","regex","expr","between","lt","gt","lte","gte","int","Number","isInteger","finite","isFinite","positive","negative","number","numberChainable","betweenBigInt","ltBigInt","gtBigInt","lteBigInt","gteBigInt","positiveBigInt","negativeBigInt","bigint","bigintChainable","boolean","symbol","nullish","_arrayChainable","v","_chainable2","Set","size","_chainable3","Map","_args$","toString","patternKey","patternValue","keyMatch","valueMatch","_chainable6","classConstructor","val","isInstanceOf","unmatched","MatchExpression","input","state","this","_proto","prototype","_this","handler","apply","hasSelections","selected","otherwise","exhaustive","run","displayedValue","JSON","stringify","e","returnType"],"mappings":"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"}

@@ -50,6 +50,19 @@ import * as symbols from './internals/symbols.cjs';

*/
export type infer<p extends Pattern<any>> = InvertPattern<p, unknown>;
export type narrow<i, p extends Pattern<any>> = ExtractPreciseValue<i, InvertPattern<p, i>>;
type Variadic<p> = p & Iterable<p>;
type ArrayChainable<p, omitted extends string = never> = Variadic<p> & Omit<{
export type infer<pattern extends Pattern<any>> = InvertPattern<pattern, unknown>;
/**
* `P.narrow<Input, Pattern>` will narrow the input type to only keep
* the set of values that are compatible with the provided pattern type.
*
* [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnarrow)
*
* @example
* type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']
* const Pattern = ['a', P.union('a', 'b')] as const
*
* type Narrowed = P.narrow<Input, typeof Pattern>
* // ^? ['a', 'a' | 'b']
*/
export type narrow<input, pattern extends Pattern<any>> = ExtractPreciseValue<input, InvertPattern<pattern, input>>;
type Variadic<pattern> = pattern & Iterable<pattern>;
type ArrayChainable<pattern, omitted extends string = never> = Variadic<pattern> & Omit<{
/**

@@ -65,3 +78,3 @@ * `.optional()` returns a pattern which matches if the

*/
optional<input>(): ArrayChainable<OptionalP<input, p>, omitted | 'optional'>;
optional<input>(): ArrayChainable<OptionalP<input, pattern>, omitted | 'optional'>;
/**

@@ -76,4 +89,4 @@ * `P.select()` will inject this property into the handler function's arguments.

*/
select<input>(): ArrayChainable<SelectP<symbols.anonymousSelectKey, input, p>, omitted | 'select'>;
select<input, k extends string>(key: k): ArrayChainable<SelectP<k, input, p>, omitted | 'select'>;
select<input>(): ArrayChainable<SelectP<symbols.anonymousSelectKey, input, pattern>, omitted | 'select'>;
select<input, k extends string>(key: k): ArrayChainable<SelectP<k, input, pattern>, omitted | 'select'>;
}, omitted>;

@@ -90,3 +103,3 @@ /**

*/
export declare function optional<input, const p extends unknown extends input ? UnknownPattern : Pattern<input>>(pattern: p): Chainable<OptionalP<input, p>, 'optional'>;
export declare function optional<input, const pattern extends unknown extends input ? UnknownPattern : Pattern<input>>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'>;
type UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;

@@ -108,3 +121,3 @@ type UnwrapSet<xs> = xs extends Set<infer x> ? x : never;

export declare function array<input>(): ArrayChainable<ArrayP<input, unknown>>;
export declare function array<input, const p extends Pattern<WithDefault<UnwrapArray<input>, unknown>>>(pattern: p): ArrayChainable<ArrayP<input, p>>;
export declare function array<input, const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;
/**

@@ -121,3 +134,3 @@ * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches

export declare function set<input>(): Chainable<SetP<input, unknown>>;
export declare function set<input, const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>>(pattern: p): Chainable<SetP<input, p>>;
export declare function set<input, const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>>(pattern: pattern): Chainable<SetP<input, pattern>>;
/**

@@ -154,3 +167,3 @@ * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches

*/
export declare function intersection<input, const ps extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: ps): Chainable<AndP<input, ps>>;
export declare function intersection<input, const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: patterns): Chainable<AndP<input, patterns>>;
/**

@@ -169,3 +182,3 @@ * `P.union(...patterns)` returns a pattern which matches

*/
export declare function union<input, const ps extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: ps): Chainable<OrP<input, ps>>;
export declare function union<input, const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: patterns): Chainable<OrP<input, patterns>>;
/**

@@ -182,3 +195,3 @@ * `P.not(pattern)` returns a pattern which matches if the sub pattern

*/
export declare function not<input, const p extends Pattern<input> | UnknownPattern>(pattern: p): Chainable<NotP<input, p>>;
export declare function not<input, const pattern extends Pattern<input> | UnknownPattern>(pattern: pattern): Chainable<NotP<input, pattern>>;
/**

@@ -195,3 +208,3 @@ * `P.when((value) => boolean)` returns a pattern which matches

*/
export declare function when<input, p extends (value: input) => unknown>(predicate: p): GuardP<input, p extends (value: any) => value is infer narrowed ? narrowed : never>;
export declare function when<input, predicate extends (value: input) => unknown>(predicate: predicate): GuardP<input, predicate extends (value: any) => value is infer narrowed ? narrowed : never>;
export declare function when<input, narrowed extends input, excluded>(predicate: (input: input) => input is narrowed): GuardExcludeP<input, narrowed, excluded>;

@@ -211,3 +224,3 @@ /**

export declare function select<input, const patternOrKey extends string | (unknown extends input ? UnknownPattern : Pattern<input>)>(patternOrKey: patternOrKey): patternOrKey extends string ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>> : Chainable<SelectP<symbols.anonymousSelectKey, input, patternOrKey>, 'select' | 'or' | 'and'>;
export declare function select<input, const p extends unknown extends input ? UnknownPattern : Pattern<input>, const k extends string>(key: k, pattern: p): Chainable<SelectP<k, input, p>, 'select' | 'or' | 'and'>;
export declare function select<input, const pattern extends unknown extends input ? UnknownPattern : Pattern<input>, const k extends string>(key: k, pattern: pattern): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;
type AnyConstructor = abstract new (...args: any[]) => any;

@@ -476,2 +489,2 @@ /**

*/
export declare function shape<input, const p extends Pattern<input>>(pattern: p): Chainable<GuardP<input, InvertPattern<p, input>>>;
export declare function shape<input, const pattern extends Pattern<input>>(pattern: pattern): Chainable<GuardP<input, InvertPattern<pattern, input>>>;

@@ -50,6 +50,19 @@ import * as symbols from './internals/symbols.js';

*/
export type infer<p extends Pattern<any>> = InvertPattern<p, unknown>;
export type narrow<i, p extends Pattern<any>> = ExtractPreciseValue<i, InvertPattern<p, i>>;
type Variadic<p> = p & Iterable<p>;
type ArrayChainable<p, omitted extends string = never> = Variadic<p> & Omit<{
export type infer<pattern extends Pattern<any>> = InvertPattern<pattern, unknown>;
/**
* `P.narrow<Input, Pattern>` will narrow the input type to only keep
* the set of values that are compatible with the provided pattern type.
*
* [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#Pnarrow)
*
* @example
* type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']
* const Pattern = ['a', P.union('a', 'b')] as const
*
* type Narrowed = P.narrow<Input, typeof Pattern>
* // ^? ['a', 'a' | 'b']
*/
export type narrow<input, pattern extends Pattern<any>> = ExtractPreciseValue<input, InvertPattern<pattern, input>>;
type Variadic<pattern> = pattern & Iterable<pattern>;
type ArrayChainable<pattern, omitted extends string = never> = Variadic<pattern> & Omit<{
/**

@@ -65,3 +78,3 @@ * `.optional()` returns a pattern which matches if the

*/
optional<input>(): ArrayChainable<OptionalP<input, p>, omitted | 'optional'>;
optional<input>(): ArrayChainable<OptionalP<input, pattern>, omitted | 'optional'>;
/**

@@ -76,4 +89,4 @@ * `P.select()` will inject this property into the handler function's arguments.

*/
select<input>(): ArrayChainable<SelectP<symbols.anonymousSelectKey, input, p>, omitted | 'select'>;
select<input, k extends string>(key: k): ArrayChainable<SelectP<k, input, p>, omitted | 'select'>;
select<input>(): ArrayChainable<SelectP<symbols.anonymousSelectKey, input, pattern>, omitted | 'select'>;
select<input, k extends string>(key: k): ArrayChainable<SelectP<k, input, pattern>, omitted | 'select'>;
}, omitted>;

@@ -90,3 +103,3 @@ /**

*/
export declare function optional<input, const p extends unknown extends input ? UnknownPattern : Pattern<input>>(pattern: p): Chainable<OptionalP<input, p>, 'optional'>;
export declare function optional<input, const pattern extends unknown extends input ? UnknownPattern : Pattern<input>>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'>;
type UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;

@@ -108,3 +121,3 @@ type UnwrapSet<xs> = xs extends Set<infer x> ? x : never;

export declare function array<input>(): ArrayChainable<ArrayP<input, unknown>>;
export declare function array<input, const p extends Pattern<WithDefault<UnwrapArray<input>, unknown>>>(pattern: p): ArrayChainable<ArrayP<input, p>>;
export declare function array<input, const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;
/**

@@ -121,3 +134,3 @@ * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches

export declare function set<input>(): Chainable<SetP<input, unknown>>;
export declare function set<input, const p extends Pattern<WithDefault<UnwrapSet<input>, unknown>>>(pattern: p): Chainable<SetP<input, p>>;
export declare function set<input, const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>>(pattern: pattern): Chainable<SetP<input, pattern>>;
/**

@@ -154,3 +167,3 @@ * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches

*/
export declare function intersection<input, const ps extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: ps): Chainable<AndP<input, ps>>;
export declare function intersection<input, const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: patterns): Chainable<AndP<input, patterns>>;
/**

@@ -169,3 +182,3 @@ * `P.union(...patterns)` returns a pattern which matches

*/
export declare function union<input, const ps extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: ps): Chainable<OrP<input, ps>>;
export declare function union<input, const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]>(...patterns: patterns): Chainable<OrP<input, patterns>>;
/**

@@ -182,3 +195,3 @@ * `P.not(pattern)` returns a pattern which matches if the sub pattern

*/
export declare function not<input, const p extends Pattern<input> | UnknownPattern>(pattern: p): Chainable<NotP<input, p>>;
export declare function not<input, const pattern extends Pattern<input> | UnknownPattern>(pattern: pattern): Chainable<NotP<input, pattern>>;
/**

@@ -195,3 +208,3 @@ * `P.when((value) => boolean)` returns a pattern which matches

*/
export declare function when<input, p extends (value: input) => unknown>(predicate: p): GuardP<input, p extends (value: any) => value is infer narrowed ? narrowed : never>;
export declare function when<input, predicate extends (value: input) => unknown>(predicate: predicate): GuardP<input, predicate extends (value: any) => value is infer narrowed ? narrowed : never>;
export declare function when<input, narrowed extends input, excluded>(predicate: (input: input) => input is narrowed): GuardExcludeP<input, narrowed, excluded>;

@@ -211,3 +224,3 @@ /**

export declare function select<input, const patternOrKey extends string | (unknown extends input ? UnknownPattern : Pattern<input>)>(patternOrKey: patternOrKey): patternOrKey extends string ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>> : Chainable<SelectP<symbols.anonymousSelectKey, input, patternOrKey>, 'select' | 'or' | 'and'>;
export declare function select<input, const p extends unknown extends input ? UnknownPattern : Pattern<input>, const k extends string>(key: k, pattern: p): Chainable<SelectP<k, input, p>, 'select' | 'or' | 'and'>;
export declare function select<input, const pattern extends unknown extends input ? UnknownPattern : Pattern<input>, const k extends string>(key: k, pattern: pattern): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;
type AnyConstructor = abstract new (...args: any[]) => any;

@@ -476,2 +489,2 @@ /**

*/
export declare function shape<input, const p extends Pattern<input>>(pattern: p): Chainable<GuardP<input, InvertPattern<p, input>>>;
export declare function shape<input, const pattern extends Pattern<input>>(pattern: pattern): Chainable<GuardP<input, InvertPattern<pattern, input>>>;
{
"name": "ts-pattern",
"version": "5.0.3-rc.1",
"version": "5.0.3-rc.2",
"description": " The exhaustive Pattern Matching library for TypeScript.",

@@ -5,0 +5,0 @@ "type": "module",

@@ -1534,2 +1534,16 @@ <h1 align="center">TS-Pattern</h1>

### `P.narrow`
`P.narrow<Input, typeof Pattern>` will narrow the input type to only keep the set of values that are compatible with the provided pattern type.
```ts
type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c'];
const Pattern = ['a', P.union('a', 'b')] as const;
type Narrowed = P.narrow<Input, typeof Pattern>;
// ^? ['a', 'a' | 'b']
```
Note that most of the time, the `match` and `isMatching` functions perform narrowing for you, and you do not need to narrow types yourself.
### `P.Pattern`

@@ -1536,0 +1550,0 @@