@cuppachino/ts-pattern
Version:
The exhaustive Pattern Matching library for TypeScript.
32 lines (31 loc) • 1.79 kB
TypeScript
import { Primitives, IsPlainObject, IsUnion } from './helpers.js';
export declare type IsMatching<a, p> = true extends IsUnion<a> | IsUnion<p> ? true extends (p extends any ? (a extends any ? IsMatching<a, p> : never) : never) ? true : false : unknown extends p ? true : p extends Primitives ? p extends a ? true : false : [p, a] extends [readonly any[], readonly any[]] ? [p, a] extends [
readonly [infer p1, infer p2, infer p3, infer p4, infer p5],
readonly [infer a1, infer a2, infer a3, infer a4, infer a5]
] ? [
IsMatching<a1, p1>,
IsMatching<a2, p2>,
IsMatching<a3, p3>,
IsMatching<a4, p4>,
IsMatching<a5, p5>
] extends [true, true, true, true, true] ? true : false : [p, a] extends [
readonly [infer p1, infer p2, infer p3, infer p4],
readonly [infer a1, infer a2, infer a3, infer a4]
] ? [
IsMatching<a1, p1>,
IsMatching<a2, p2>,
IsMatching<a3, p3>,
IsMatching<a4, p4>
] extends [true, true, true, true] ? true : false : [p, a] extends [
readonly [infer p1, infer p2, infer p3],
readonly [infer a1, infer a2, infer a3]
] ? [IsMatching<a1, p1>, IsMatching<a2, p2>, IsMatching<a3, p3>] extends [
true,
true,
true
] ? true : false : [p, a] extends [
readonly [infer p1, infer p2],
readonly [infer a1, infer a2]
] ? [IsMatching<a1, p1>, IsMatching<a2, p2>] extends [true, true] ? true : false : [p, a] extends [readonly [infer p1], readonly [infer a1]] ? IsMatching<a1, p1> : p extends a ? true : false : IsPlainObject<p> extends true ? true extends (a extends any ? [keyof p & keyof a] extends [never] ? false : {
[k in keyof p & keyof a]: IsMatching<a[k], p[k]>;
}[keyof p & keyof a] extends true ? true : false : never) ? true : false : p extends a ? true : false;