import { err, flatten, Flattened, ok, Result } from "./result.ts"; function expectType(_: T) {} type DeepResult = Result, "middle">, "outer">; type DeepFlattened = Flattened; expectType>({} as DeepFlattened); const deepOk: DeepResult = ok(ok(ok(1))); const flattened = flatten(deepOk); expectType>(flattened); const methodFlattened = deepOk.flatten(); expectType>(methodFlattened); if (flattened.success) { expectType(flattened.data); } else { expectType<"inner" | "middle" | "outer">(flattened.error); } const innerError: Result, never>, never> = ok(ok(err("inner"))); const flattenedInnerError = flatten(innerError); expectType>(flattenedInnerError); const middleError: Result, "middle">, never> = ok(err("middle")); const flattenedMiddleError = flatten(middleError); expectType>(flattenedMiddleError); const flattenedOuterError = flatten(err("outer" as const)); expectType>(flattenedOuterError); // @ts-expect-error flatten should preserve the final Ok value type. expectType>(flattened); // @ts-expect-error flatten should preserve every nested Err type. expectType>(flattened); // @ts-expect-error .flatten() should use the same inference as flatten(...). expectType>(methodFlattened);