{"version":3,"file":"index.mjs","names":["state"],"sources":["../src/error.ts","../src/dual.ts","../src/option.ts"],"sourcesContent":["/** Serialize cause for JSON output */\nconst serializeCause = (cause: unknown): unknown => {\n  if (cause instanceof Error) {\n    return { name: cause.name, message: cause.message, stack: cause.stack };\n  }\n  return cause;\n};\n\n/**\n * Unrecoverable error — user code threw inside Option operations.\n *\n * @example\n * // Panic in generator cleanup:\n * Option.gen(function* () {\n *   try {\n *     yield* Option.none();\n *   } finally {\n *     throw new Error(\"cleanup failed\");  // Panic!\n *   }\n * });\n *\n * // Panic in combinator:\n * Option.some(1).map(() => { throw new Error(\"oops\"); });  // Panic!\n */\nexport class Panic extends Error {\n  readonly _tag = \"Panic\" as const;\n  override readonly cause?: unknown;\n\n  constructor(args: { message: string; cause?: unknown }) {\n    const { message, cause } = args;\n    super(message, cause !== undefined ? { cause } : undefined);\n\n    this.cause = cause;\n    this.name = \"Panic\";\n\n    Object.setPrototypeOf(this, new.target.prototype);\n\n    if (cause instanceof Error && cause.stack) {\n      const indented = cause.stack.replace(/\\n/g, \"\\n  \");\n      this.stack = `${this.stack}\\nCaused by: ${indented}`;\n    }\n  }\n\n  toJSON(): object {\n    return {\n      _tag: this._tag,\n      name: this.name,\n      message: this.message,\n      cause: serializeCause(this.cause),\n      stack: this.stack,\n    };\n  }\n}\n\n/**\n * Type guard for Panic instances.\n *\n * @example\n * if (isPanic(value)) { value.cause }\n */\nexport const isPanic = (value: unknown): value is Panic => {\n  return value instanceof Panic;\n};\n\n/**\n * Throw an unrecoverable Panic.\n *\n * @example\n * panic(\"something went wrong\", cause);\n */\nexport const panic = (message: string, cause?: unknown): never => {\n  throw new Panic({ message, cause });\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Creates data-first/data-last dual function.\n *\n * @template DataLast Curried (data-last) signature.\n * @template DataFirst Uncurried (data-first) signature.\n * @param arity Number of args for data-first form.\n * @param body Implementation function.\n * @returns Function supporting both calling conventions.\n *\n * @example\n * const add: {\n *   (a: number, b: number): number;\n *   (b: number): (a: number) => number;\n * } = dual(2, (a: number, b: number) => a + b);\n *\n * add(1, 2);  // 3 (data-first)\n * add(2)(1);  // 3 (data-last)\n */\nexport function dual<\n  DataLast extends (...args: Array<any>) => any,\n  DataFirst extends (...args: Array<any>) => any,\n>(arity: Parameters<DataFirst>[\"length\"], body: DataFirst): DataLast & DataFirst {\n  if (arity === 2) {\n    return ((...args: Array<any>) => {\n      if (args.length >= 2) {\n        return body(args[0], args[1]);\n      }\n      return (self: any) => body(self, args[0]);\n    }) as DataLast & DataFirst;\n  }\n\n  if (arity === 3) {\n    return ((...args: Array<any>) => {\n      if (args.length >= 3) {\n        return body(args[0], args[1], args[2]);\n      }\n      return (self: any) => body(self, args[0], args[1]);\n    }) as DataLast & DataFirst;\n  }\n\n  if (arity === 4) {\n    return ((...args: Array<any>) => {\n      if (args.length >= 4) {\n        return body(args[0], args[1], args[2], args[3]);\n      }\n      return (self: any) => body(self, args[0], args[1], args[2]);\n    }) as DataLast & DataFirst;\n  }\n\n  return ((...args: Array<any>) => {\n    if (args.length >= arity) {\n      return body(...args);\n    }\n    return (self: any) => body(self, ...args);\n  }) as DataLast & DataFirst;\n}\n","import { panic } from \"./error\";\nimport { dual } from \"./dual\";\n\n/** Executes fn, panics if it throws. */\nconst tryOrPanic = <T>(fn: () => T, message: string): T => {\n  try {\n    return fn();\n  } catch (cause) {\n    throw panic(message, cause);\n  }\n};\n\n/** Async version of tryOrPanic. */\nconst tryOrPanicAsync = async <T>(fn: () => Promise<T>, message: string): Promise<T> => {\n  try {\n    return await fn();\n  } catch (cause) {\n    throw panic(message, cause);\n  }\n};\n\n/**\n * Present value variant.\n *\n * @template A Value type.\n *\n * @example\n * const option = new Some(42);\n * option.value // 42\n * option.status // \"some\"\n */\nexport class Some<A> {\n  readonly status = \"some\" as const;\n  constructor(readonly value: A) {}\n\n  /** Returns true, narrowing Option to Some. */\n  isSome(): this is Some<A> {\n    return true;\n  }\n\n  /** Returns false, narrowing Option to None. */\n  isNone(): this is None {\n    return false;\n  }\n\n  /**\n   * Transforms value.\n   *\n   * @template B Transformed type.\n   * @param fn Transformation function.\n   * @returns Some with transformed value.\n   * @throws {Panic} If fn throws.\n   *\n   * @example\n   * some(2).map(x => x * 2) // Some(4)\n   */\n  map<B>(fn: (a: A) => B): Some<B> {\n    return tryOrPanic(() => new Some<B>(fn(this.value)), \"map callback threw\");\n  }\n\n  /**\n   * Chains Option-returning function.\n   *\n   * @template B New value type.\n   * @param fn Function returning Option.\n   * @returns Option from fn.\n   * @throws {Panic} If fn throws.\n   *\n   * @example\n   * some(2).andThen(x => x > 0 ? some(x) : none()) // Some(2)\n   */\n  andThen<B>(fn: (a: A) => Option<B>): Option<B> {\n    return tryOrPanic(() => fn(this.value), \"andThen callback threw\");\n  }\n\n  /**\n   * Chains async Option-returning function.\n   *\n   * @template B New value type.\n   * @param fn Async function returning Option.\n   * @returns Promise of Option from fn.\n   * @throws {Panic} If fn throws synchronously or rejects.\n   *\n   * @example\n   * await some(1).andThenAsync(async x => some(await fetchData(x)))\n   */\n  andThenAsync<B>(fn: (a: A) => Promise<Option<B>>): Promise<Option<B>> {\n    return tryOrPanicAsync(() => fn(this.value), \"andThenAsync callback threw\");\n  }\n\n  /**\n   * Pattern matches on Option.\n   *\n   * @template T Return type.\n   * @param handlers Some and none handlers.\n   * @returns Result of some handler.\n   * @throws {Panic} If handler throws.\n   *\n   * @example\n   * some(2).match({ some: x => x * 2, none: () => 0 }) // 4\n   */\n  match<T>(handlers: { some: (a: A) => T; none: () => T }): T {\n    return tryOrPanic(() => handlers.some(this.value), \"match some handler threw\");\n  }\n\n  /**\n   * Extracts value.\n   *\n   * @param _message Ignored.\n   * @returns The value.\n   *\n   * @example\n   * some(42).unwrap() // 42\n   */\n  unwrap(_message?: string): A {\n    return this.value;\n  }\n\n  /**\n   * Returns value, ignoring fallback.\n   *\n   * @template B Fallback type.\n   * @param _fallback Ignored.\n   * @returns The value.\n   *\n   * @example\n   * some(42).unwrapOr(0) // 42\n   */\n  unwrapOr<B>(_fallback: B): A {\n    return this.value;\n  }\n\n  /**\n   * Returns value, ignoring fallback thunk.\n   *\n   * @template B Fallback type.\n   * @param _fallback Ignored.\n   * @returns The value.\n   *\n   * @example\n   * some(42).unwrapOrElse(() => 0) // 42\n   */\n  unwrapOrElse<B>(_fallback: () => B): A {\n    return this.value;\n  }\n\n  /**\n   * Runs side effect, returns self.\n   *\n   * @param fn Side effect function.\n   * @returns Self.\n   * @throws {Panic} If fn throws.\n   *\n   * @example\n   * some(2).tap(console.log).map(x => x * 2) // logs 2, returns Some(4)\n   */\n  tap(fn: (a: A) => void): Some<A> {\n    return tryOrPanic(() => {\n      fn(this.value);\n      return this;\n    }, \"tap callback threw\");\n  }\n\n  /**\n   * Runs async side effect, returns self.\n   *\n   * @param fn Async side effect function.\n   * @returns Promise of self.\n   * @throws {Panic} If fn throws synchronously or rejects.\n   *\n   * @example\n   * await some(2).tapAsync(async x => await log(x))\n   */\n  tapAsync(fn: (a: A) => Promise<void>): Promise<Some<A>> {\n    return tryOrPanicAsync(async () => {\n      await fn(this.value);\n      return this;\n    }, \"tapAsync callback threw\");\n  }\n\n  /**\n   * Returns Some if predicate passes, None otherwise.\n   *\n   * @param predicate Test function.\n   * @returns Some if predicate returns true, None otherwise.\n   * @throws {Panic} If predicate throws.\n   *\n   * @example\n   * some(5).filter(x => x > 3) // Some(5)\n   * some(2).filter(x => x > 3) // None\n   */\n  filter(predicate: (a: A) => boolean): Option<A> {\n    return tryOrPanic(\n      () => (predicate(this.value) ? this : None.instance),\n      \"filter predicate threw\",\n    );\n  }\n\n  /**\n   * Makes Some yieldable in Option.gen blocks.\n   * Immediately returns the value without yielding.\n   */\n  // oxlint-disable-next-line require-yield\n  *[Symbol.iterator](): Generator<None, A, unknown> {\n    return this.value;\n  }\n}\n\n/**\n * Absent value variant (singleton).\n *\n * @example\n * const option = None.instance;\n * option.status // \"none\"\n */\nexport class None {\n  readonly status = \"none\" as const;\n\n  private constructor() {}\n\n  /** Singleton instance. */\n  static readonly instance = new None();\n\n  /** Returns false, narrowing Option to Some. */\n  isSome(): this is Some<never> {\n    return false;\n  }\n\n  /** Returns true, narrowing Option to None. */\n  isNone(): this is None {\n    return true;\n  }\n\n  /**\n   * No-op on None, returns self.\n   *\n   * @template U New phantom value type.\n   * @param _fn Ignored.\n   * @returns Self.\n   */\n  map<U>(_fn: (a: never) => U): None {\n    return this;\n  }\n\n  /**\n   * No-op on None, returns self.\n   *\n   * @template U New phantom value type.\n   * @param _fn Ignored.\n   * @returns Self.\n   */\n  andThen<U>(_fn: (a: never) => Option<U>): None {\n    return this;\n  }\n\n  /**\n   * No-op on None, returns Promise of self.\n   *\n   * @template U New phantom value type.\n   * @param _fn Ignored.\n   * @returns Promise of self.\n   */\n  andThenAsync<U>(_fn: (a: never) => Promise<Option<U>>): Promise<None> {\n    return Promise.resolve(this);\n  }\n\n  /**\n   * Pattern matches on Option.\n   *\n   * @template R Return type.\n   * @param handlers Some and none handlers.\n   * @returns Result of none handler.\n   * @throws {Panic} If handler throws.\n   *\n   * @example\n   * none().match({ some: x => x, none: () => \"empty\" }) // \"empty\"\n   */\n  match<R>(handlers: { some: (a: never) => R; none: () => R }): R {\n    return tryOrPanic(() => handlers.none(), \"match none handler threw\");\n  }\n\n  /**\n   * Throws error with optional message.\n   *\n   * @param message Error message.\n   * @throws Always throws.\n   *\n   * @example\n   * none().unwrap() // throws Panic\n   * none().unwrap(\"custom\") // throws Panic(\"custom\")\n   */\n  unwrap(message?: string): never {\n    return panic(message ?? \"Unwrap called on None\");\n  }\n\n  /**\n   * Returns fallback value.\n   *\n   * @template U Fallback type.\n   * @param fallback Fallback value.\n   * @returns Fallback.\n   *\n   * @example\n   * none().unwrapOr(42) // 42\n   */\n  unwrapOr<U>(fallback: U): U {\n    return fallback;\n  }\n\n  /**\n   * Computes and returns fallback value.\n   *\n   * @template U Fallback type.\n   * @param fallback Fallback thunk.\n   * @returns Result of fallback.\n   * @throws {Panic} If fallback throws.\n   *\n   * @example\n   * none().unwrapOrElse(() => 42) // 42\n   */\n  unwrapOrElse<U>(fallback: () => U): U {\n    return tryOrPanic(fallback, \"unwrapOrElse fallback threw\");\n  }\n\n  /**\n   * No-op on None, returns self.\n   *\n   * @param _fn Ignored.\n   * @returns Self.\n   */\n  tap(_fn: (a: never) => void): None {\n    return this;\n  }\n\n  /**\n   * No-op on None, returns Promise of self.\n   *\n   * @param _fn Ignored.\n   * @returns Promise of self.\n   */\n  tapAsync(_fn: (a: never) => Promise<void>): Promise<None> {\n    return Promise.resolve(this);\n  }\n\n  /**\n   * No-op on None, returns self.\n   *\n   * @param _predicate Ignored.\n   * @returns Self.\n   */\n  filter(_predicate: (a: never) => boolean): None {\n    return this;\n  }\n\n  /**\n   * Makes None yieldable in Option.gen blocks.\n   * Yields None for proper generator short-circuiting.\n   */\n  *[Symbol.iterator](): Generator<None, never, unknown> {\n    yield this;\n    return panic(\"Unreachable: None yielded in Option.gen but generator continued\");\n  }\n}\n\n/**\n * Union type representing presence or absence of a value.\n *\n * @template A Value type.\n *\n * @example\n * type MaybeUser = Option<User>;\n */\nexport type Option<A> = Some<A> | None;\n\n/**\n * Infer the value type from an Option.\n * Distributive: InferValue<Some<A> | Some<B>> = A | B\n */\nexport type InferValue<O> = O extends Some<infer A> ? A : never;\n\n/**\n * Constraint for any Option type.\n * Used in Option.gen to accept flexible return types from generators.\n */\ntype AnyOption = Some<unknown> | None;\n\nfunction some(): Some<void>;\nfunction some<A>(value: A): Some<A>;\nfunction some(value?: unknown): Some<unknown> {\n  return new Some(value);\n}\n\nconst none = (): None => None.instance;\n\nconst isSome = <A>(option: Option<A>): option is Some<A> => {\n  return option.status === \"some\";\n};\n\nconst isNone = <A>(option: Option<A>): option is None => {\n  return option.status === \"none\";\n};\n\nconst map: {\n  <A, B>(option: Option<A>, fn: (a: A) => B): Option<B>;\n  <A, B>(fn: (a: A) => B): (option: Option<A>) => Option<B>;\n} = dual(2, <A, B>(option: Option<A>, fn: (a: A) => B): Option<B> => {\n  return option.map(fn);\n});\n\nconst andThen: {\n  <A, B>(option: Option<A>, fn: (a: A) => Option<B>): Option<B>;\n  <A, B>(fn: (a: A) => Option<B>): (option: Option<A>) => Option<B>;\n} = dual(2, <A, B>(option: Option<A>, fn: (a: A) => Option<B>): Option<B> => {\n  return option.andThen(fn);\n});\n\nconst andThenAsync: {\n  <A, B>(option: Option<A>, fn: (a: A) => Promise<Option<B>>): Promise<Option<B>>;\n  <A, B>(fn: (a: A) => Promise<Option<B>>): (option: Option<A>) => Promise<Option<B>>;\n} = dual(2, <A, B>(option: Option<A>, fn: (a: A) => Promise<Option<B>>): Promise<Option<B>> => {\n  return option.andThenAsync(fn);\n});\n\nconst match: {\n  <A, T>(option: Option<A>, handlers: { some: (a: A) => T; none: () => T }): T;\n  <A, T>(handlers: { some: (a: A) => T; none: () => T }): (option: Option<A>) => T;\n} = dual(2, <A, T>(option: Option<A>, handlers: { some: (a: A) => T; none: () => T }): T => {\n  return option.match(handlers);\n});\n\nconst tap: {\n  <A>(option: Option<A>, fn: (a: A) => void): Option<A>;\n  <A>(fn: (a: A) => void): (option: Option<A>) => Option<A>;\n} = dual(2, <A>(option: Option<A>, fn: (a: A) => void): Option<A> => {\n  return option.tap(fn);\n});\n\nconst tapAsync: {\n  <A>(option: Option<A>, fn: (a: A) => Promise<void>): Promise<Option<A>>;\n  <A>(fn: (a: A) => Promise<void>): (option: Option<A>) => Promise<Option<A>>;\n} = dual(2, <A>(option: Option<A>, fn: (a: A) => Promise<void>): Promise<Option<A>> => {\n  return option.tapAsync(fn);\n});\n\nconst unwrap = <A>(option: Option<A>, message?: string): A => {\n  return option.unwrap(message);\n};\n\nconst unwrapOr: {\n  <A, B>(option: Option<A>, fallback: B): A | B;\n  <B>(fallback: B): <A>(option: Option<A>) => A | B;\n} = dual(2, <A, B>(option: Option<A>, fallback: B): A | B => {\n  return option.unwrapOr(fallback);\n});\n\n/** Validates that a value is an Option instance. Throws with helpful message if not. */\nfunction assertIsOption(value: unknown): asserts value is Option<unknown> {\n  if (\n    value !== null &&\n    typeof value === \"object\" &&\n    \"status\" in value &&\n    (value.status === \"some\" || value.status === \"none\")\n  ) {\n    return;\n  }\n  return panic(\n    \"Option.gen body must return Option.some() or Option.none(), got: \" +\n      (value === null ? \"null\" : typeof value === \"object\" ? JSON.stringify(value) : String(value)),\n  );\n}\n\nconst gen: {\n  <R extends AnyOption>(body: () => Generator<None, R, unknown>): Option<InferValue<R>>;\n  <R extends AnyOption, This>(\n    body: (this: This) => Generator<None, R, unknown>,\n    thisArg: This,\n  ): Option<InferValue<R>>;\n  <R extends AnyOption>(\n    body: () => AsyncGenerator<None, R, unknown>,\n  ): Promise<Option<InferValue<R>>>;\n  <R extends AnyOption, This>(\n    body: (this: This) => AsyncGenerator<None, R, unknown>,\n    thisArg: This,\n  ): Promise<Option<InferValue<R>>>;\n} = (<R extends AnyOption, This>(\n  body:\n    | (() => Generator<None, R, unknown>)\n    | (() => AsyncGenerator<None, R, unknown>)\n    | ((this: This) => Generator<None, R, unknown>)\n    | ((this: This) => AsyncGenerator<None, R, unknown>),\n  thisArg?: This,\n): Option<InferValue<R>> | Promise<Option<InferValue<R>>> => {\n  // SAFETY: body.call binds thisArg; cast needed due to union of function signatures\n  const iterator = (body as (this: This) => Generator<None, R, unknown>).call(thisArg as This);\n\n  // Detect async generator via Symbol.asyncIterator\n  if (Symbol.asyncIterator in iterator) {\n    return (async () => {\n      // SAFETY: Async check above guarantees this is an async generator\n      const asyncIter = iterator as unknown as AsyncGenerator<None, R, unknown>;\n\n      let state: IteratorResult<None, R>;\n      try {\n        state = await asyncIter.next();\n      } catch (cause) {\n        // Generator body threw before yielding (user code error or cleanup on success path)\n        throw panic(\"generator body threw\", cause);\n      }\n\n      assertIsOption(state.value);\n\n      if (!state.done) {\n        // Close generator to run finally blocks and Symbol.asyncDispose.\n        // If cleanup throws, it's unrecoverable — Panic.\n        try {\n          await asyncIter.return?.(undefined as unknown as R);\n        } catch (cause) {\n          throw panic(\"generator cleanup threw\", cause);\n        }\n      }\n\n      return state.value as Option<InferValue<R>>;\n    })();\n  }\n\n  // Sync generator\n  // SAFETY: If not async, must be sync generator\n  const syncIter = iterator as Generator<None, R, unknown>;\n\n  let state: IteratorResult<None, R>;\n  try {\n    state = syncIter.next();\n  } catch (cause) {\n    // Generator body threw before yielding (user code error or cleanup on success path)\n    throw panic(\"generator body threw\", cause);\n  }\n\n  assertIsOption(state.value);\n\n  if (!state.done) {\n    // Close generator to run finally blocks and Symbol.dispose.\n    // If cleanup throws, it's unrecoverable — Panic.\n    try {\n      syncIter.return?.(undefined as unknown as R);\n    } catch (cause) {\n      throw panic(\"generator cleanup threw\", cause);\n    }\n  }\n\n  return state.value as Option<InferValue<R>>;\n}) as {\n  <R extends AnyOption>(body: () => Generator<None, R, unknown>): Option<InferValue<R>>;\n  <R extends AnyOption, This>(\n    body: (this: This) => Generator<None, R, unknown>,\n    thisArg: This,\n  ): Option<InferValue<R>>;\n  <R extends AnyOption>(\n    body: () => AsyncGenerator<None, R, unknown>,\n  ): Promise<Option<InferValue<R>>>;\n  <R extends AnyOption, This>(\n    body: (this: This) => AsyncGenerator<None, R, unknown>,\n    thisArg: This,\n  ): Promise<Option<InferValue<R>>>;\n};\n\nasync function* optionAwait<A>(promise: Promise<Option<A>>): AsyncGenerator<None, A, unknown> {\n  const option = await promise;\n  return yield* option;\n}\n\n/** Shape of a serialized Some over RPC. */\nexport interface SerializedSome<A> {\n  status: \"some\";\n  value: A;\n}\n\n/** Shape of a serialized None over RPC. */\nexport interface SerializedNone {\n  status: \"none\";\n}\n\n/** Shape of a serialized Option over RPC. */\nexport type SerializedOption<A> = SerializedSome<A> | SerializedNone;\n\nfunction isSerializedOption(obj: unknown): obj is SerializedOption<unknown> {\n  return (\n    obj !== null &&\n    typeof obj === \"object\" &&\n    \"status\" in obj &&\n    ((obj.status === \"some\" && \"value\" in obj) || obj.status === \"none\")\n  );\n}\n\nconst serialize = <A>(option: Option<A>): SerializedOption<A> => {\n  return option.status === \"some\" ? { status: \"some\", value: option.value } : { status: \"none\" };\n};\n\nconst deserialize = <A>(value: unknown): Option<A> | null => {\n  if (isSerializedOption(value)) {\n    return value.status === \"some\" ? (new Some(value.value) as Option<A>) : None.instance;\n  }\n  return null;\n};\n\nconst partition = <A>(options: readonly Option<A>[]): [A[], number] => {\n  const values: A[] = [];\n  let noneCount = 0;\n  for (const o of options) {\n    if (o.status === \"some\") {\n      values.push(o.value);\n    } else {\n      noneCount++;\n    }\n  }\n  return [values, noneCount];\n};\n\n/**\n * Flattens nested Option into single Option.\n *\n * @example\n * const nested: Option<Option<number>> = Option.some(Option.some(42));\n * const flat: Option<number> = Option.flatten(nested); // Some(42)\n */\nconst flatten = <A>(option: Option<Option<A>>): Option<A> => {\n  if (option.status === \"some\") {\n    return option.value;\n  }\n  return option;\n};\n\n/**\n * Converts nullable value to Option.\n * null and undefined become None, everything else becomes Some.\n */\nconst from = <A>(value: A | null | undefined): Option<NonNullable<A>> => {\n  return value == null ? None.instance : new Some(value as NonNullable<A>);\n};\n\n/**\n * Creates Option based on predicate result.\n * Some if predicate passes, None otherwise.\n */\nconst fromPredicate: {\n  <A, B extends A>(value: A, predicate: (a: A) => a is B): Option<B>;\n  <A>(value: A, predicate: (a: A) => boolean): Option<A>;\n  <A, B extends A>(predicate: (a: A) => a is B): (value: A) => Option<B>;\n  <A>(predicate: (a: A) => boolean): (value: A) => Option<A>;\n} = dual(2, <A>(value: A, predicate: (a: A) => boolean): Option<A> => {\n  return tryOrPanic(\n    () => (predicate(value) ? new Some(value) : None.instance),\n    \"fromPredicate predicate threw\",\n  );\n});\n\n/**\n * Filters Option based on predicate.\n * Some becomes None if predicate fails.\n */\nconst filter: {\n  <A, B extends A>(option: Option<A>, predicate: (a: A) => a is B): Option<B>;\n  <A>(option: Option<A>, predicate: (a: A) => boolean): Option<A>;\n  <A, B extends A>(predicate: (a: A) => a is B): (option: Option<A>) => Option<B>;\n  <A>(predicate: (a: A) => boolean): (option: Option<A>) => Option<A>;\n} = dual(2, <A>(option: Option<A>, predicate: (a: A) => boolean): Option<A> => {\n  return option.filter(predicate);\n});\n\n/**\n * Combines two Options into Option of tuple.\n * Returns Some([a, b]) if both are Some, None otherwise.\n */\nconst zip = <A, B>(optionA: Option<A>, optionB: Option<B>): Option<[A, B]> => {\n  if (optionA.status === \"some\" && optionB.status === \"some\") {\n    return new Some<[A, B]>([optionA.value, optionB.value]);\n  }\n  return None.instance;\n};\n\n/**\n * Extracts value or computes fallback lazily.\n */\nconst unwrapOrElse: {\n  <A, B>(option: Option<A>, fallback: () => B): A | B;\n  <B>(fallback: () => B): <A>(option: Option<A>) => A | B;\n} = dual(2, <A, B>(option: Option<A>, fallback: () => B): A | B => {\n  return option.unwrapOrElse(fallback);\n});\n\n/**\n * Utilities for creating and handling Option types.\n *\n * @example\n * const option = Option.from(maybeNull);\n * const value = option.map(x => x.id).unwrapOr(\"default\");\n */\nexport const Option = {\n  /**\n   * Creates present value.\n   *\n   * @example\n   * Option.some(42)  // Some<number>\n   * Option.some()    // Some<void>\n   */\n  some,\n  /**\n   * Creates absent value.\n   *\n   * @example\n   * Option.none() // None\n   */\n  none,\n  /**\n   * Type guard for Some.\n   *\n   * @example\n   * if (Option.isSome(option)) { option.value }\n   */\n  isSome,\n  /**\n   * Type guard for None.\n   *\n   * @example\n   * if (Option.isNone(option)) { // handle absent }\n   */\n  isNone,\n  /**\n   * Transforms value, passes None through.\n   *\n   * @example\n   * Option.map(some(2), x => x * 2) // Some(4)\n   * Option.map(x => x * 2)(some(2)) // Some(4)\n   */\n  map,\n  /**\n   * Chains Option-returning function on Some.\n   *\n   * @example\n   * Option.andThen(some(2), x => x > 0 ? some(x) : none()) // Some(2)\n   */\n  andThen,\n  /**\n   * Chains async Option-returning function on Some.\n   *\n   * @example\n   * await Option.andThenAsync(some(1), async x => some(await fetch(x)))\n   */\n  andThenAsync,\n  /**\n   * Pattern matches on Option.\n   *\n   * @example\n   * Option.match(some(2), { some: x => x * 2, none: () => 0 }) // 4\n   */\n  match,\n  /**\n   * Runs side effect on Some value, returns original option.\n   *\n   * @example\n   * Option.tap(some(2), console.log) // logs 2, returns Some(2)\n   */\n  tap,\n  /**\n   * Runs async side effect on Some value, returns original option.\n   *\n   * @example\n   * await Option.tapAsync(some(2), async x => await log(x))\n   */\n  tapAsync,\n  /**\n   * Extracts value or throws.\n   *\n   * @example\n   * Option.unwrap(some(42)) // 42\n   * Option.unwrap(none()) // throws Panic\n   */\n  unwrap,\n  /**\n   * Extracts value or returns fallback.\n   *\n   * @example\n   * Option.unwrapOr(some(42), 0) // 42\n   * Option.unwrapOr(none(), 0) // 0\n   */\n  unwrapOr,\n  /**\n   * Generator-based composition for Option types.\n   *\n   * @example\n   * const option = Option.gen(function* () {\n   *   const a = yield* getA(); // Option<A>\n   *   const b = yield* getB(a); // Option<B>\n   *   return Option.some({ a, b });\n   * });\n   * // Option<{a, b}>\n   *\n   * @example\n   * // Async with Option.await\n   * const option = await Option.gen(async function* () {\n   *   const a = yield* Option.await(fetchA());\n   *   const b = yield* Option.await(fetchB(a));\n   *   return Option.some({ a, b });\n   * });\n   */\n  gen,\n  /**\n   * Wraps Promise<Option> to be yieldable in async Option.gen blocks.\n   *\n   * @example\n   * yield* Option.await(fetchUser(id))\n   */\n  await: optionAwait,\n  /**\n   * Converts an Option to a plain object for serialization (e.g., RPC, server actions).\n   *\n   * @example\n   * const serialized = Option.serialize(some(42)); // { status: \"some\", value: 42 }\n   */\n  serialize,\n  /**\n   * Rehydrates serialized Option from RPC back into Some/None instances.\n   * Returns null if not a serialized Option.\n   *\n   * @example\n   * const option = Option.deserialize<User>(rpcResponse);\n   */\n  deserialize,\n  /**\n   * Splits array of Options into tuple of [someValues, noneCount].\n   *\n   * @example\n   * partition([some(1), none(), some(2)]) // [[1, 2], 1]\n   */\n  partition,\n  /**\n   * Flattens nested Option into single Option.\n   *\n   * @example\n   * const nested = Option.some(Option.some(42));\n   * Option.flatten(nested) // Some(42)\n   */\n  flatten,\n  /**\n   * Converts nullable value to Option.\n   * null and undefined become None, everything else becomes Some.\n   *\n   * @example\n   * Option.from(user)         // Some(user) if user exists\n   * Option.from(null)         // None\n   * Option.from(undefined)    // None\n   */\n  from,\n  /**\n   * Creates Option based on predicate result.\n   * Some if predicate passes, None otherwise.\n   *\n   * @example\n   * Option.fromPredicate(5, x => x > 3)           // Some(5)\n   * Option.fromPredicate(2, x => x > 3)           // None\n   * Option.fromPredicate(x => x > 3)(5)           // Some(5) - pipeable\n   */\n  fromPredicate,\n  /**\n   * Filters Option based on predicate.\n   * Some becomes None if predicate fails.\n   *\n   * @example\n   * Option.filter(some(5), x => x > 3)            // Some(5)\n   * Option.filter(some(2), x => x > 3)            // None\n   * Option.filter(x => x > 3)(some(5))            // Some(5) - pipeable\n   */\n  filter,\n  /**\n   * Combines two Options into Option of tuple.\n   * Returns Some([a, b]) if both are Some, None otherwise.\n   *\n   * @example\n   * Option.zip(some(1), some(\"a\"))                // Some([1, \"a\"])\n   * Option.zip(some(1), none())                   // None\n   */\n  zip,\n  /**\n   * Extracts value or computes fallback lazily.\n   *\n   * @example\n   * Option.unwrapOrElse(some(42), () => 0)           // 42\n   * Option.unwrapOrElse(none(), () => expensiveDefault()) // expensiveDefault()\n   */\n  unwrapOrElse,\n} as const;\n"],"mappings":"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"}