UNPKG

@consolidados/results

Version:
1 lines 8.03 kB
{"version":3,"sources":["../../src/helpers/match.ts"],"names":[],"mappings":"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","file":"match.cjs","sourcesContent":["import type { Option } from \"../option\";\nimport type { Result } from \"../result\";\n\n// Utility types for mixed primitive + object unions\ntype PrimitiveMembers<T> = Extract<T, PropertyKey>;\ntype ObjectKeys<T> = T extends object ? keyof T : never;\ntype ObjectPropertyType<T, K extends PropertyKey> = T extends object\n ? K extends keyof T\n ? T[K]\n : never\n : never;\n\n// Helper to determine if a key K is a primitive member or object key\ntype HandlerFor<T, K extends PropertyKey, R> = K extends PrimitiveMembers<T>\n ? () => R\n : K extends ObjectKeys<T>\n ? (value: ObjectPropertyType<T, K>) => R\n : never;\n\n// Build cases type with a single mapped type\ntype MatchCases<T, R, HasDefault extends boolean = false> = (HasDefault extends true\n ? Partial<{\n [K in PrimitiveMembers<T> | ObjectKeys<T>]: HandlerFor<T, K, R>;\n }>\n : {\n [K in PrimitiveMembers<T> | ObjectKeys<T>]: HandlerFor<T, K, R>;\n }) &\n (HasDefault extends true ? { default: () => R } : {});\n\n// Overload for Result type\nexport function match<T, E, ROk, RErr>(\n matcher: Result<T, E>,\n cases: {\n Ok: (value: T) => ROk;\n Err: (error: E) => RErr;\n },\n): ROk | RErr;\n\n// Overload for Option type\nexport function match<T, RSome, RNone>(\n matcher: Option<T>,\n cases: {\n Some: (value: T) => RSome;\n None: () => RNone;\n },\n): RSome | RNone;\n\n// Overload for mixed primitive + object unions WITH default (cases optional)\nexport function match<T extends PropertyKey | object, R>(\n matcher: T,\n cases: MatchCases<T, R, true>,\n): R;\n\n// Overload for mixed primitive + object unions WITHOUT default (exhaustive)\nexport function match<T extends PropertyKey | object, R>(\n matcher: T,\n cases: MatchCases<T, R, false>,\n): R;\n\n// Overload for discriminated unions with default case\nexport function match<\n T extends { [K in D]: string | number | symbol },\n D extends keyof T,\n R,\n>(\n matcher: T,\n cases: { [K in T[D]]?: (value: Extract<T, { [P in D]: K }>) => R } & {\n default: (value: T) => R;\n },\n discriminant: D,\n): R;\n\n// Overload for discriminated unions without default case (exhaustive)\nexport function match<\n T extends { [K in D]: string | number | symbol },\n D extends keyof T,\n R,\n>(\n matcher: T,\n cases: { [K in T[D]]: (value: Extract<T, { [P in D]: K }>) => R },\n discriminant: D,\n): R;\n\n// Overload for primitives with default case\nexport function match<T extends PropertyKey, R>(\n matcher: T,\n cases: Partial<Record<T, () => R>> & { default: () => R },\n): R;\n\n// Overload for primitives without default case (exhaustive)\nexport function match<T extends PropertyKey, R>(\n matcher: T,\n cases: Record<T, () => R>,\n): R;\n\n// Implementation\nexport function match<T, E, R>(\n matcher: Result<T, E> | Option<T> | any,\n cases: any,\n discriminant?: keyof any,\n): R {\n // Handle primitives (string, number, symbol) FIRST\n if (\n typeof matcher === \"string\" ||\n typeof matcher === \"number\" ||\n typeof matcher === \"symbol\"\n ) {\n const handler = cases[matcher];\n\n if (handler) {\n return handler();\n }\n\n if (cases.default) {\n return cases.default();\n }\n\n throw new Error(`No case found for value: ${String(matcher)}`);\n }\n\n // NEW: Handle objects with specific property keys (like { Other: [...] })\n // This must come BEFORE discriminated union check to handle mixed unions\n if (typeof matcher === \"object\" && matcher !== null && !discriminant) {\n // Check if any case key matches a property in the matcher object\n for (const key in cases) {\n if (key === \"default\") continue;\n\n if (key in matcher) {\n const handler = cases[key];\n if (handler) {\n return typeof handler === \"function\"\n ? handler(matcher[key])\n : handler();\n }\n }\n }\n\n // If no match found and there's a default, use it\n if (cases.default) {\n return cases.default();\n }\n }\n\n // Handle discriminated unions\n if (discriminant && typeof matcher === \"object\" && matcher !== null) {\n const discriminantValue = matcher[discriminant];\n const handler = cases[discriminantValue];\n\n if (handler) {\n return handler(matcher);\n }\n\n if (cases.default) {\n return cases.default(matcher);\n }\n\n throw new Error(\n `No case found for discriminant value: ${String(discriminantValue)}`,\n );\n }\n\n // Early return for Result.Ok\n if (\n typeof matcher === \"object\" &&\n matcher !== null &&\n \"isOk\" in matcher &&\n matcher.isOk()\n ) {\n if (!cases.Ok) throw new Error(\"Missing case for Ok\");\n return cases.Ok(matcher.unwrap());\n }\n\n // Early return for Result.Err\n if (\n typeof matcher === \"object\" &&\n matcher !== null &&\n \"isErr\" in matcher &&\n matcher.isErr()\n ) {\n if (!cases.Err) throw new Error(\"Missing case for Err\");\n return cases.Err(matcher.unwrapErr() as E);\n }\n\n // Early return for Option.Some\n if (\n typeof matcher === \"object\" &&\n matcher !== null &&\n \"isSome\" in matcher &&\n matcher.isSome()\n ) {\n if (!cases.Some) throw new Error(\"Missing case for Some\");\n return cases.Some(matcher.unwrap());\n }\n\n // Early return for Option.None\n if (\n typeof matcher === \"object\" &&\n matcher !== null &&\n \"isNone\" in matcher &&\n matcher.isNone()\n ) {\n if (!cases.None) throw new Error(\"Missing case for None\");\n return cases.None();\n }\n\n throw new Error(\"Invalid matcher or missing case\");\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n(globalThis as any).match = match;\n"]}