{"version":3,"file":"Boxed.mjs","sources":["../src/Dict.ts","../src/referenceStore.ts","../src/symbols.ts","../src/ZipUnzip.ts","../src/OptionResult.ts","../src/Array.ts","../src/AsyncData.ts","../src/Future.ts","../src/Deferred.ts","../src/Lazy.ts","../src/Serializer.ts"],"sourcesContent":["import { Option } from \"./OptionResult\";\nimport { LooseRecord } from \"./types\";\n\nexport const fromEntries = Object.fromEntries;\n\nexport const entries = <T extends LooseRecord<unknown>>(value: T) => {\n  return Object.entries(value) as {\n    [K in keyof T]-?: [K, T[K]];\n  }[keyof T][];\n};\n\nexport const keys = <T extends LooseRecord<unknown>>(value: T) =>\n  Object.keys(value) as (keyof T)[];\n\nexport const values = <T extends LooseRecord<unknown>>(value: T) =>\n  Object.values(value) as T[keyof T][];\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n\nexport const fromOptional = <Dict extends LooseRecord<Option<any>>>(\n  dict: Dict,\n): {\n  [K in keyof Dict]?: Dict[K] extends Option<infer T> ? T : never;\n} => {\n  const result: Record<PropertyKey, unknown> = {};\n  for (const key in dict) {\n    if (hasOwnProperty.call(dict, key)) {\n      const item = dict[key];\n      if (item === undefined) {\n        // should happen, but let's make the compiler happy\n        continue;\n      }\n      if (item.isSome()) {\n        result[key] = item.get();\n      }\n    }\n  }\n\n  return result as {\n    [K in keyof Dict]?: Dict[K] extends Option<infer T> ? T : never;\n  };\n};\n","const weakRefFallbackMap = new WeakMap();\n\ninterface WeakRefLike<T extends WeakKey> {\n  deref(): T | undefined;\n}\n\n// We can replicate the WeakRef for older browsers using a `WeakMap` using\n// the weakref-like instace as key.\nconst WeakRefWithLegacyFallback =\n  typeof WeakRef === \"function\"\n    ? WeakRef\n    : class WeakRefWithFallback {\n        constructor(value: unknown) {\n          weakRefFallbackMap.set(this, value);\n        }\n        deref() {\n          return weakRefFallbackMap.get(this);\n        }\n      };\n// For each tag variant that can contain a value (`Some`, `Ok`, `Error`, `Done`), we create a store.\n// The store enables us to keep a map of `value` to the container of this `value`.\n\n// The container is stored through a `WeakRef`, ensuring that we don't prevent the containers\n// from being garbage-collected.\nexport const createStore = () => {\n  const store = new Map<unknown, WeakRefLike<object>>();\n\n  // We subscribe to the garbage collection, to make sure we don't keep in memory\n  // some values that we don't need as keys, because if all instances of a container of\n  // a given value have been garbage collected, there isn't any comparison required.\n\n  // For instance, let's say we have an object `x`, and create a `Option.Some(x)`:\n  // 1. As long as `Option.Some(x)` isn't garbage collected,\n  //    it means that the value needs to remain stable as it can be compared to\n  //    another `Option.Some(x)`.\n  // 2. If all references to `Option.Some(x)` are garbage collected, it means that\n  //    it's safe to dispose, as we don't have anymore requirement for comparison.\n  // 3. If we re-create an `Option.Some(x)` afterwards, the first one re-created is\n  //    the new basis for comparison.\n  const registry =\n    typeof FinalizationRegistry === \"function\"\n      ? new FinalizationRegistry((value) => {\n          store.delete(value);\n        })\n      : undefined;\n\n  return {\n    set: (key: unknown, value: object) => {\n      store.set(key, new WeakRefWithLegacyFallback(value));\n      // Older browsers that don't have `FinalizationRegistry` don't benefit\n      // from the memory cleanup, but that's fine as a best-effort thing\n      if (registry !== undefined) {\n        registry.register(value, key);\n      }\n    },\n    get: (key: unknown): unknown => {\n      const value = store.get(key);\n      if (value !== undefined) {\n        return value.deref();\n      }\n    },\n  };\n};\n","export const BOXED_TYPE = Symbol.for(\"__boxed_type__\");\n","export const unzip = <TupleArray extends [any, any][]>(array: TupleArray) => {\n  const length = array.length;\n  const arrayA = Array(length);\n  const arrayB = Array(length);\n  let index = -1;\n  while (++index < length) {\n    const match = array[index];\n    if (match !== undefined) {\n      arrayA[index] = match[0];\n      arrayB[index] = match[1];\n    }\n  }\n  return [arrayA, arrayB] as [\n    {\n      [I in keyof TupleArray]: TupleArray[I] extends [any, any]\n        ? TupleArray[I][0] extends infer T\n          ? T\n          : never\n        : never;\n    },\n    {\n      [I in keyof TupleArray]: TupleArray[I] extends [any, any]\n        ? TupleArray[I][1] extends infer T\n          ? T\n          : never\n        : never;\n    },\n  ];\n};\n\nexport const zip = <ArrayA extends any[], ArrayB extends any[]>(\n  arrayA: ArrayA,\n  arrayB: ArrayB,\n) => {\n  const length = Math.min(arrayA.length, arrayB.length);\n  const array = Array(length);\n  let index = -1;\n  while (++index < length) {\n    array[index] = [arrayA[index], arrayB[index]];\n  }\n  return array as [\n    {\n      [I in keyof ArrayA]: ArrayA[I] extends infer T ? T : never;\n    }[number],\n    {\n      [I in keyof ArrayB]: ArrayB[I] extends infer T ? T : never;\n    }[number],\n  ][];\n};\n","import { keys, values } from \"./Dict\";\nimport { createStore } from \"./referenceStore\";\nimport { BOXED_TYPE } from \"./symbols\";\nimport { JsonOption, JsonResult, LooseRecord } from \"./types\";\nimport { zip } from \"./ZipUnzip\";\n\nconst SomeStore = createStore();\n\nclass __Option<A> {\n  static P = {\n    Some: <const A>(value: A) => ({ tag: \"Some\", value }) as const,\n    None: { tag: \"None\" } as const,\n  };\n\n  static Some = <A = never>(value: A): Option<A> => {\n    const existing = SomeStore.get(value);\n    if (existing == undefined) {\n      const option = Object.create(OPTION_PROTO) as Some<A>;\n      // @ts-expect-error\n      option.tag = \"Some\";\n      // @ts-expect-error\n      option.value = value;\n      Object.freeze(option);\n      SomeStore.set(value, option);\n      return option;\n    } else {\n      return existing as Some<A>;\n    }\n  };\n\n  static None = <A = never>(): Option<A> => NONE as None<A>;\n\n  static isOption = (value: unknown): value is Option<unknown> =>\n    // @ts-ignore\n    value != null && value.__boxed_type__ === \"Option\";\n\n  /**\n   * Create an Option from a nullable value\n   */\n  static fromNullable = <A>(nullable: A | null | undefined): Option<A> => {\n    return nullable == null ? (NONE as None<A>) : Option.Some<A>(nullable);\n  };\n\n  /**\n   * Create an Option from a value | null\n   */\n  static fromNull = <A>(nullable: A | null): Option<A> => {\n    return nullable === null ? (NONE as None<A>) : Option.Some<A>(nullable);\n  };\n\n  /**\n   * Create an Option from a undefined | value\n   */\n  static fromUndefined = <A>(nullable: A | undefined): Option<A> => {\n    return nullable === undefined\n      ? (NONE as None<A>)\n      : Option.Some<A>(nullable);\n  };\n\n  /**\n   * Create an Option from a value & predicate\n   */\n\n  static fromPredicate<A, B extends A>(\n    value: A,\n    predicate: (value: A) => value is B,\n  ): Option<B>;\n  static fromPredicate<A>(\n    value: A,\n    predicate: (value: A) => boolean,\n  ): Option<A>;\n  static fromPredicate<A>(\n    value: A,\n    predicate: (value: A) => boolean,\n  ): Option<A> {\n    if (predicate(value)) {\n      return Option.Some(value);\n    } else {\n      return NONE as Option<A>;\n    }\n  }\n\n  /**\n   * Turns an array of options into an option of array\n   */\n  static all = <Options extends Option<any>[] | []>(options: Options) => {\n    const length = options.length;\n    let acc = Option.Some<Array<unknown>>([]);\n    let index = 0;\n\n    while (true) {\n      if (index >= length) {\n        return acc as Option<{\n          [K in keyof Options]: Options[K] extends Option<infer T> ? T : never;\n        }>;\n      }\n\n      const item = options[index];\n\n      if (item != null) {\n        acc = acc.flatMap((array) => {\n          return item.map((value) => {\n            array.push(value);\n            return array;\n          });\n        });\n      }\n\n      index++;\n    }\n  };\n\n  /**\n   * Turns an dict of options into a options of dict\n   */\n  static allFromDict = <Dict extends LooseRecord<Option<any>>>(\n    dict: Dict,\n  ): Option<{\n    [K in keyof Dict]: Dict[K] extends Option<infer T> ? T : never;\n  }> => {\n    const dictKeys = keys(dict);\n\n    return Option.all(values(dict)).map((values) =>\n      Object.fromEntries(zip(dictKeys, values)),\n    );\n  };\n\n  static equals = <A>(\n    a: Option<A>,\n    b: Option<A>,\n    equals: (a: A, b: A) => boolean,\n  ): boolean => {\n    return a.isSome() && b.isSome()\n      ? equals(a.get(), b.get())\n      : a.tag === b.tag;\n  };\n\n  static fromJSON = <A>(value: JsonOption<A>) => {\n    return value.tag === \"None\" ? Option.None() : Option.Some(value.value);\n  };\n\n  /**\n   * Returns the Option containing the value from the callback\n   *\n   * (Option\\<A>, A => B) => Option\\<B>\n   */\n  map<B>(this: Option<A>, func: (value: A) => B): Option<B> {\n    if (this === NONE) {\n      return this as unknown as Option<B>;\n    }\n    return Option.Some(func((this as Some<A>).value));\n  }\n\n  /**\n   * Returns the Option containing the value from the callback\n   *\n   * (Option\\<A>, A => Option\\<B>) => Option\\<B>\n   */\n  flatMap<B>(this: Option<A>, func: (value: A) => Option<B>): Option<B> {\n    if (this === NONE) {\n      return this as unknown as Option<B>;\n    }\n    return func((this as Some<A>).value);\n  }\n\n  /**\n   * Returns the Option if its value matches the predicate, otherwise false\n   *\n   * (Option\\<A>, A => boolean) => Option\\<A>\n   */\n  filter<B extends A>(\n    this: Option<A>,\n    func: (value: A) => value is B,\n  ): Option<B>;\n  filter(this: Option<A>, func: (value: A) => boolean): Option<A>;\n  filter(this: Option<A>, func: (value: A) => boolean): Option<A> {\n    if (this === NONE) {\n      return this as unknown as Option<A>;\n    }\n    return func((this as Some<A>).value) ? this : (NONE as None<A>);\n  }\n\n  /**\n   * Returns the value. Use within `if (Option.isSome()) { ... }`\n   */\n  get(this: Some<A>) {\n    return this.value;\n  }\n  /**\n   * Return the value if present, and the fallback otherwise\n   *\n   * (Option\\<A>, A) => A\n   * @deprecated\n   */\n  getWithDefault(this: Option<A>, defaultValue: A): A {\n    if (this === NONE) {\n      return defaultValue;\n    }\n    return (this as Some<A>).value;\n  }\n  /**\n   * Return the value if present, and the fallback otherwise\n   *\n   * (Option\\<A>, A) => A\n   */\n  getOr(this: Option<A>, defaultValue: A): A {\n    if (this === NONE) {\n      return defaultValue;\n    }\n    return (this as Some<A>).value;\n  }\n\n  /**\n   * Return the value if present, and the fallback otherwise\n   *\n   * (Option\\<A>, Option\\<A>) => Option\\<A>\n   */\n  orElse(this: Option<A>, other: Option<A>): Option<A> {\n    if (this === NONE) {\n      return other;\n    }\n    return this;\n  }\n\n  /**\n   * Maps the value if present, returns the fallback otherwise\n   *\n   * (Option\\<A>, B, A => B) => B\n   */\n  mapOr<B>(this: Option<A>, defaultValue: B, mapper: (value: A) => B): B {\n    if (this === NONE) {\n      return defaultValue;\n    }\n    return mapper((this as Some<A>).value);\n  }\n\n  /**\n   * Explodes the Option given its case\n   */\n  match<B1, B2 = B1>(\n    this: Option<A>,\n    config: { Some: (value: A) => B1; None: () => B2 },\n  ): B1 | B2 {\n    if (this === NONE) {\n      return config.None();\n    }\n    return config.Some((this as Some<A>).value);\n  }\n\n  /**\n   * Runs the callback and returns `this`\n   */\n  tap(this: Option<A>, func: (option: Option<A>) => unknown): Option<A> {\n    func(this);\n    return this;\n  }\n\n  /**\n   * Runs the callback if some and returns `this`\n   */\n  tapSome(this: Option<A>, func: (option: A) => unknown): Option<A> {\n    if (this === NONE) {\n      return this;\n    }\n    func((this as Some<A>).value);\n    return this;\n  }\n\n  /**\n   * Converts the Option\\<A> to a `A | undefined`\n   */\n  toUndefined(this: Option<A>): A | undefined {\n    if (this === NONE) {\n      return undefined;\n    }\n    return (this as Some<A>).value;\n  }\n\n  /**\n   * Converts the Option\\<A> to a `A | null`\n   */\n  toNull(this: Option<A>): A | null {\n    if (this === NONE) {\n      return null;\n    }\n    return (this as Some<A>).value;\n  }\n\n  /**\n   * Takes the option and turns it into Ok(value) is Some, or Error(valueWhenNone)\n   */\n  toResult<E>(this: Option<A>, valueWhenNone: E): Result<A, E> {\n    return this.match({\n      Some: (ok) => Result.Ok(ok),\n      None: () => Result.Error(valueWhenNone),\n    });\n  }\n\n  /**\n   * Typeguard\n   */\n  isSome(this: Option<A>): this is Some<A> {\n    return this !== NONE;\n  }\n\n  /**\n   * Typeguard\n   */\n  isNone(this: Option<A>): this is None<A> {\n    return this === NONE;\n  }\n\n  toJSON(this: Option<A>): JsonOption<A> {\n    return this.match<JsonOption<A>>({\n      None: () => ({ [BOXED_TYPE]: \"Option\", tag: \"None\" }),\n      Some: (value) => ({ [BOXED_TYPE]: \"Option\", tag: \"Some\", value }),\n    });\n  }\n}\n\n// @ts-expect-error\n__Option.prototype.__boxed_type__ = \"Option\";\n\nconst OPTION_PROTO = __Option.prototype;\n\nconst NONE = (() => {\n  const option = Object.create(OPTION_PROTO) as None<unknown>;\n  // @ts-expect-error\n  option.tag = \"None\";\n  Object.freeze(option);\n  return option;\n})();\n\ninterface Some<A> extends __Option<A> {\n  readonly tag: \"Some\";\n  readonly value: A;\n}\n\ninterface None<A> extends __Option<A> {\n  readonly tag: \"None\";\n}\n\nexport const Option = __Option;\nexport type Option<A> = Some<A> | None<A>;\n\nconst OkStore = createStore();\nconst ErrorStore = createStore();\n\nclass __Result<A, E> {\n  static P = {\n    Ok: <const A>(value: A) => ({ tag: \"Ok\", value }) as const,\n    Error: <const E>(error: E) => ({ tag: \"Error\", error }) as const,\n  };\n\n  static Ok = <A = never, E = never>(value: A): Result<A, E> => {\n    const existing = OkStore.get(value);\n    if (existing == undefined) {\n      const result = Object.create(RESULT_PROTO) as Ok<A, E>;\n      // @ts-expect-error\n      result.tag = \"Ok\";\n      // @ts-expect-error\n      result.value = value;\n      Object.freeze(result);\n      OkStore.set(value, result);\n      return result;\n    } else {\n      return existing as Ok<A, E>;\n    }\n  };\n\n  static Error = <A = never, E = never>(error: E): Result<A, E> => {\n    const existing = ErrorStore.get(error);\n    if (existing == undefined) {\n      const result = Object.create(RESULT_PROTO) as Error<A, E>;\n      // @ts-expect-error\n      result.tag = \"Error\";\n      // @ts-expect-error\n      result.error = error;\n      Object.freeze(result);\n      ErrorStore.set(error, result);\n      return result;\n    } else {\n      return existing as Error<A, E>;\n    }\n  };\n\n  static isResult = (value: unknown): value is Result<unknown, unknown> =>\n    // @ts-ignore\n    value != null && value.__boxed_type__ === \"Result\";\n\n  /**\n   * Runs the function and resolves a result of its return value, or to an error if thrown\n   */\n  static fromExecution = <A, E = unknown>(func: () => A): Result<A, E> => {\n    try {\n      return Result.Ok(func());\n    } catch (error) {\n      return Result.Error(error) as Result<A, E>;\n    }\n  };\n\n  /**\n   * Takes the promise and resolves a result of its value, or to an error if rejected\n   */\n  static fromPromise = async <A, E = unknown>(\n    promise: Promise<A>,\n  ): Promise<Result<A, E>> => {\n    try {\n      const value = await promise;\n      return Result.Ok<A, E>(value);\n    } catch (error) {\n      return Result.Error<A, E>(error as E);\n    }\n  };\n\n  /**\n   * Takes the option and turns it into Ok(value) is Some, or Error(valueWhenNone)\n   */\n  static fromOption = <A, E>(\n    option: Option<A>,\n    valueWhenNone: E,\n  ): Result<A, E> => {\n    return option.toResult(valueWhenNone);\n  };\n\n  /**\n   * Turns an array of results into an result of array\n   */\n  static all = <Results extends Result<any, any>[] | []>(results: Results) => {\n    const length = results.length;\n    let acc = Result.Ok<Array<unknown>, unknown>([]);\n    let index = 0;\n\n    while (true) {\n      if (index >= length) {\n        return acc as Result<\n          {\n            [K in keyof Results]: Results[K] extends Result<infer T, any>\n              ? T\n              : never;\n          },\n          {\n            [K in keyof Results]: Results[K] extends Result<any, infer T>\n              ? T\n              : never;\n          }[number]\n        >;\n      }\n\n      const item = results[index];\n\n      if (item != null) {\n        acc = acc.flatMap((array) => {\n          return item.map((value) => {\n            array.push(value);\n            return array;\n          });\n        });\n      }\n\n      index++;\n    }\n  };\n\n  /**\n   * Turns an dict of results into a results of dict\n   */\n  static allFromDict = <Dict extends LooseRecord<Result<any, any>>>(\n    dict: Dict,\n  ): Result<\n    {\n      [K in keyof Dict]: Dict[K] extends Result<infer T, any> ? T : never;\n    },\n    {\n      [K in keyof Dict]: Dict[K] extends Result<any, infer T> ? T : never;\n    }[keyof Dict]\n  > => {\n    const dictKeys = keys(dict);\n\n    return Result.all(values(dict)).map((values) =>\n      Object.fromEntries(zip(dictKeys, values)),\n    );\n  };\n\n  static equals = <A, E>(\n    a: Result<A, E>,\n    b: Result<A, E>,\n    equals: (a: A, b: A) => boolean,\n  ) => {\n    if (a.tag !== b.tag) {\n      return false;\n    }\n    if (a.isError() && b.isError()) {\n      return true;\n    }\n\n    if (a.isOk() && b.isOk()) {\n      return equals(a.get(), b.get());\n    }\n\n    return false;\n  };\n\n  static fromJSON = <A, E>(value: JsonResult<A, E>): Result<A, E> => {\n    return value.tag === \"Ok\"\n      ? Result.Ok(value.value)\n      : Result.Error(value.error);\n  };\n\n  /**\n   * Returns the Result containing the value from the callback\n   *\n   * (Result\\<A, E>, A => B) => Result\\<B>\n   */\n  map<B>(this: Result<A, E>, func: (value: A) => B): Result<B, E> {\n    return this.tag === \"Ok\"\n      ? Result.Ok(func(this.value))\n      : (this as unknown as Result<B, E>);\n  }\n\n  /**\n   * Returns the Result containing the error returned from the callback\n   *\n   * (Result\\<A, E>, E => F) => Result\\<F>\n   */\n  mapError<F>(this: Result<A, E>, func: (value: E) => F): Result<A, F> {\n    return this.tag === \"Ok\"\n      ? (this as unknown as Result<A, F>)\n      : Result.Error(func(this.error));\n  }\n\n  /**\n   * Returns the Result containing the value from the callback\n   *\n   * (Result\\<A, E>, A => Result\\<B, F>) => Result\\<B, E | F>\n   */\n  flatMap<B, F>(\n    this: Result<A, E>,\n    func: (value: A) => Result<B, F>,\n  ): Result<B, F | E> {\n    return this.tag === \"Ok\"\n      ? func(this.value)\n      : (this as unknown as Result<B, F | E>);\n  }\n\n  /**\n   * Returns the Result containing the value from the callback\n   *\n   * (Result\\<A, E>, E => Result\\<A, F>) => Result\\<A | B, F>\n   */\n  flatMapError<B, F>(\n    this: Result<A, E>,\n    func: (value: E) => Result<B, F>,\n  ): Result<A | B, F> {\n    return this.tag === \"Ok\"\n      ? (this as unknown as Result<A | B, F>)\n      : func(this.error);\n  }\n  /**\n   * Returns the value. Use within `if (result.isOk()) { ... }`\n   */\n  get(this: Ok<A, E>) {\n    return this.value;\n  }\n\n  /**\n   * Returns the error. Use within `if (result.isError()) { ... }`\n   */\n  getError(this: Error<A, E>) {\n    return this.error;\n  }\n\n  /**\n   * Return the value if present, and the fallback otherwise\n   *\n   * (Result\\<A, E>, A) => A\n   * @deprecated\n   */\n  getWithDefault(this: Result<A, E>, defaultValue: A): A {\n    return this.tag === \"Ok\" ? this.value : defaultValue;\n  }\n\n  /**\n   * Return the value if present, and the fallback otherwise\n   *\n   * (Result\\<A, E>, A) => A\n   */\n  getOr(this: Result<A, E>, defaultValue: A): A {\n    return this.tag === \"Ok\" ? this.value : defaultValue;\n  }\n\n  /**\n   * Maps the value if present, returns the fallback otherwise\n   *\n   * (Result\\<A, E>, B, A => B) => B\n   */\n  mapOr<B>(this: Result<A, E>, defaultValue: B, mapper: (value: A) => B): B {\n    if (this.tag === \"Error\") {\n      return defaultValue;\n    }\n    return mapper((this as Ok<A, E>).value);\n  }\n\n  /**\n   * Explodes the Result given its case\n   */\n  match<B1, B2 = B1>(\n    this: Result<A, E>,\n    config: { Ok: (value: A) => B1; Error: (error: E) => B2 },\n  ): B1 | B2 {\n    return this.tag === \"Ok\" ? config.Ok(this.value) : config.Error(this.error);\n  }\n\n  /**\n   * Runs the callback and returns `this`\n   */\n  tap(\n    this: Result<A, E>,\n    func: (result: Result<A, E>) => unknown,\n  ): Result<A, E> {\n    func(this);\n    return this;\n  }\n\n  /**\n   * Runs the callback if ok and returns `this`\n   */\n  tapOk(this: Result<A, E>, func: (value: A) => unknown): Result<A, E> {\n    if (this.tag === \"Ok\") {\n      func(this.value);\n    }\n    return this;\n  }\n\n  /**\n   * Runs the callback if error and returns `this`\n   */\n  tapError(this: Result<A, E>, func: (error: E) => unknown): Result<A, E> {\n    if (this.tag === \"Error\") {\n      func(this.error);\n    }\n    return this;\n  }\n\n  /**\n   * Return an option of the value\n   *\n   * (Result\\<A, E>) => Option\\<A>\n   */\n  toOption(this: Result<A, E>): Option<A> {\n    return this.tag === \"Ok\" ? Option.Some(this.value) : (NONE as None<A>);\n  }\n\n  /**\n   * Typeguard\n   */\n  isOk(this: Result<A, E>): this is Ok<A, E> {\n    return this.tag === \"Ok\";\n  }\n\n  /**\n   * Typeguard\n   */\n  isError(this: Result<A, E>): this is Error<A, E> {\n    return this.tag === \"Error\";\n  }\n\n  toJSON(this: Result<A, E>): JsonResult<A, E> {\n    return this.match<JsonResult<A, E>>({\n      Ok: (value) => ({ [BOXED_TYPE]: \"Result\", tag: \"Ok\", value }),\n      Error: (error) => ({ [BOXED_TYPE]: \"Result\", tag: \"Error\", error }),\n    });\n  }\n}\n\n// @ts-expect-error\n__Result.prototype.__boxed_type__ = \"Result\";\n\nconst RESULT_PROTO = __Result.prototype;\n\ninterface Ok<A, E> extends __Result<A, E> {\n  readonly tag: \"Ok\";\n  readonly value: A;\n}\n\ninterface Error<A, E> extends __Result<A, E> {\n  readonly tag: \"Error\";\n  readonly error: E;\n}\n\nexport const Result = __Result;\nexport type Result<A, E> = Ok<A, E> | Error<A, E>;\n","import { Option } from \"./OptionResult\";\n\nexport const from = Array.from;\n\nexport const of = Array.of;\n\nexport const isArray = Array.isArray;\n\nexport const findMap = <A, B>(\n  array: ReadonlyArray<A>,\n  func: (item: A) => Option<B>,\n): Option<B> => {\n  let index = -1;\n  while (++index < array.length) {\n    const item = array[index] as A;\n    const mapped = func(item);\n    if (mapped.isSome()) {\n      return mapped;\n    }\n  }\n  return Option.None();\n};\n\nexport const filterMap = <A, B>(\n  array: ReadonlyArray<A>,\n  func: (item: A) => Option<B>,\n): Array<B> => {\n  const result: Array<B> = [];\n  array.forEach((item) => {\n    const mapped = func(item);\n    if (mapped.isSome()) {\n      result.push(mapped.get());\n    }\n  });\n  return result;\n};\n\nexport const find = <A>(\n  array: ReadonlyArray<A>,\n  func: (item: A) => boolean,\n): Option<A> => {\n  let index = -1;\n  while (++index < array.length) {\n    const item = array[index] as A;\n    if (func(item)) {\n      return Option.Some(item);\n    }\n  }\n  return Option.None();\n};\n\nexport const findIndex = <A>(\n  array: ReadonlyArray<A>,\n  func: (item: A) => boolean,\n): Option<number> => {\n  let index = -1;\n  while (++index < array.length) {\n    const item = array[index] as A;\n    if (func(item)) {\n      return Option.Some(index);\n    }\n  }\n  return Option.None();\n};\n\nconst defaultCompare = <A>(a: A, b: A) => {\n  if (a === b) {\n    return 0;\n  }\n  return a > b ? 1 : -1;\n};\n\nexport const binarySearchBy = <A>(\n  sortedArray: ReadonlyArray<A>,\n  key: A,\n  compare = defaultCompare,\n) => {\n  if (sortedArray.length === 0) {\n    return -1;\n  }\n  let low = 0;\n  let high = sortedArray.length - 1;\n  while (true) {\n    let mid = (low + (high - low) / 2) | 0;\n    if (mid === low || mid === high) {\n      return high;\n    }\n    let midItem = sortedArray[mid] as A;\n    let diff = compare(key, midItem);\n    if (diff === 0) {\n      return mid;\n    }\n    if (diff > 0) {\n      low = mid;\n      continue;\n    }\n    if (diff < 0) {\n      high = mid;\n      continue;\n    }\n  }\n};\n\nexport { unzip, zip } from \"./ZipUnzip\";\n","import { keys, values } from \"./Dict\";\nimport { Option, Result } from \"./OptionResult\";\nimport { createStore } from \"./referenceStore\";\nimport { BOXED_TYPE } from \"./symbols\";\nimport { JsonAsyncData, LooseRecord } from \"./types\";\nimport { zip } from \"./ZipUnzip\";\n\nconst AsyncDataStore = createStore();\n\nclass __AsyncData<A> {\n  static P = {\n    Done: <const A>(value: A) => ({ tag: \"Done\", value }) as const,\n    NotAsked: { tag: \"NotAsked\" } as const,\n    Loading: { tag: \"Loading\" } as const,\n  };\n  /**\n   * Create an AsyncData.Done value\n   */\n  static Done = <A = never>(value: A): AsyncData<A> => {\n    const existing = AsyncDataStore.get(value);\n    if (existing == undefined) {\n      const asyncData = Object.create(ASYNC_DATA_PROTO) as Done<A>;\n      // @ts-expect-error\n      asyncData.tag = \"Done\";\n      // @ts-expect-error\n      asyncData.value = value;\n      Object.freeze(asyncData);\n      AsyncDataStore.set(value, asyncData);\n      return asyncData;\n    } else {\n      return existing as Done<A>;\n    }\n  };\n\n  /**\n   * Create an AsyncData.Loading value\n   */\n  static Loading = <A = never>(): AsyncData<A> => LOADING as Loading<A>;\n\n  /**\n   * Create an AsyncData.NotAsked value\n   */\n  static NotAsked = <A = never>(): AsyncData<A> => NOT_ASKED as NotAsked<A>;\n\n  /**\n   * Turns an array of asyncData into an asyncData of array\n   */\n  static all = <AsyncDatas extends AsyncData<any>[] | []>(\n    asyncDatas: AsyncDatas,\n  ) => {\n    const length = asyncDatas.length;\n    let acc = AsyncData.Done<Array<unknown>>([]);\n    let index = 0;\n\n    while (true) {\n      if (index >= length) {\n        return acc as AsyncData<{\n          [K in keyof AsyncDatas]: AsyncDatas[K] extends AsyncData<infer T>\n            ? T\n            : never;\n        }>;\n      }\n\n      const item = asyncDatas[index];\n\n      if (item != null) {\n        acc = acc.flatMap((array) => {\n          return item.map((value) => {\n            array.push(value);\n            return array;\n          });\n        });\n      }\n\n      index++;\n    }\n  };\n\n  /**\n   * Turns an dict of asyncData into a asyncData of dict\n   */\n  static allFromDict = <Dict extends LooseRecord<AsyncData<any>>>(\n    dict: Dict,\n  ): AsyncData<{\n    [K in keyof Dict]: Dict[K] extends AsyncData<infer T> ? T : never;\n  }> => {\n    const dictKeys = keys(dict);\n\n    return AsyncData.all(values(dict)).map((values) =>\n      Object.fromEntries(zip(dictKeys, values)),\n    );\n  };\n\n  static equals = <A>(\n    a: AsyncData<A>,\n    b: AsyncData<A>,\n    equals: (a: A, b: A) => boolean,\n  ) => {\n    return a.tag === \"Done\" && b.tag === \"Done\"\n      ? equals(a.value, b.value)\n      : a.tag === b.tag;\n  };\n\n  static isAsyncData = (value: unknown): value is AsyncData<unknown> =>\n    // @ts-ignore\n    value != null && value.__boxed_type__ === \"AsyncData\";\n\n  static fromJSON = <A>(value: JsonAsyncData<A>) => {\n    return value.tag === \"NotAsked\"\n      ? AsyncData.NotAsked()\n      : value.tag === \"Loading\"\n        ? AsyncData.Loading()\n        : AsyncData.Done(value.value);\n  };\n\n  map<B>(this: AsyncData<A>, func: (value: A) => B): AsyncData<B> {\n    if (this === NOT_ASKED || this === LOADING) {\n      return this as unknown as AsyncData<B>;\n    }\n    return AsyncData.Done(func((this as Done<A>).value));\n  }\n\n  flatMap<B>(\n    this: AsyncData<A>,\n    func: (value: A) => AsyncData<B>,\n  ): AsyncData<B> {\n    if (this === NOT_ASKED || this === LOADING) {\n      return this as unknown as AsyncData<B>;\n    }\n    return func((this as Done<A>).value);\n  }\n\n  /**\n   * For AsyncData<Result<*>>:\n   *\n   * Takes a callback taking the Ok value and returning a new result and returns an AsyncData with this new result\n   */\n  mapOkToResult<A, E, B, F>(\n    this: AsyncData<Result<A, E>>,\n    func: (value: A) => Result<B, F>,\n  ): AsyncData<Result<B, F | E>> {\n    return this.map((value) => {\n      return value.match({\n        Ok: (value) => func(value),\n        Error: () => value as unknown as Result<B, E | F>,\n      });\n    });\n  }\n\n  /**\n   * For AsyncData<Result<*>>:\n   *\n   * Takes a callback taking the Error value and returning a new result and returns an AsyncData with this new result\n   */\n  mapErrorToResult<A, E, B, F>(\n    this: AsyncData<Result<A, E>>,\n    func: (value: E) => Result<B, F>,\n  ): AsyncData<Result<A | B, F>> {\n    return this.map((value) => {\n      return value.match({\n        Error: (error) => func(error),\n        Ok: () => value as unknown as Result<A | B, F>,\n      });\n    });\n  }\n\n  /**\n   * For AsyncData<Result<*>>:\n   *\n   * Takes a callback taking the Ok value and returning a new ok value and returns an AsyncData resolving to this new result\n   */\n  mapOk<A, E, B>(\n    this: AsyncData<Result<A, E>>,\n    func: (value: A) => B,\n  ): AsyncData<Result<B, E>> {\n    return this.map((value) => {\n      return value.match({\n        Ok: (value) => Result.Ok(func(value)),\n        Error: () => value as unknown as Result<B, E>,\n      });\n    });\n  }\n\n  /**\n   * For AsyncData<Result<*>>:\n   *\n   * Takes a callback taking the Error value and returning a new error value and returns an AsyncData to this new result\n   *\n   */\n  mapError<A, E, B>(\n    this: AsyncData<Result<A, E>>,\n    func: (value: E) => B,\n  ): AsyncData<Result<A, B>> {\n    return this.map((value) => {\n      return value.match({\n        Ok: () => value as unknown as Result<A, B>,\n        Error: (error) => Result.Error(func(error)),\n      });\n    });\n  }\n\n  /**\n   * For AsyncData<Result<*>>:\n   *\n   * Takes a callback taking the Ok value and returning an AsyncData\n   */\n  flatMapOk<A, E, B, F>(\n    this: AsyncData<Result<A, E>>,\n    func: (value: A) => AsyncData<Result<B, F>>,\n  ): AsyncData<Result<B, F | E>> {\n    return this.flatMap((value) => {\n      return value.match({\n        Ok: (value) => func(value) as AsyncData<Result<B, F | E>>,\n        Error: () => AsyncData.Done(value as unknown as Result<B, F | E>),\n      });\n    });\n  }\n\n  /**\n   * For AsyncData<Result<*>>:\n   *\n   * Takes a callback taking the Error value and returning an AsyncData\n   */\n  flatMapError<A, E, B, F>(\n    this: AsyncData<Result<A, E>>,\n    func: (value: E) => AsyncData<Result<B, F>>,\n  ): AsyncData<Result<A | B, F>> {\n    return this.flatMap((value) => {\n      return value.match({\n        Ok: () => AsyncData.Done(value as unknown as Result<A | B, F>),\n        Error: (error) => func(error) as AsyncData<Result<A | B, F>>,\n      });\n    });\n  }\n\n  /**\n   * Returns the value. Use within `if (asyncData.isDone()) { ... }`\n   */\n  get(this: Done<A>) {\n    return this.value;\n  }\n\n  /**\n   * @deprecated\n   */\n  getWithDefault(this: AsyncData<A>, defaultValue: A): A {\n    if (this === NOT_ASKED || this === LOADING) {\n      return defaultValue;\n    }\n    return (this as Done<A>).value;\n  }\n\n  getOr(this: AsyncData<A>, defaultValue: A): A {\n    if (this === NOT_ASKED || this === LOADING) {\n      return defaultValue;\n    }\n    return (this as Done<A>).value;\n  }\n\n  /**\n   * Maps the value if present, returns the fallback otherwise\n   *\n   * (AsyncData\\<A>, B, A => B) => B\n   */\n  mapOr<B>(this: AsyncData<A>, defaultValue: B, mapper: (value: A) => B): B {\n    if (this === NOT_ASKED || this === LOADING) {\n      return defaultValue;\n    }\n    return mapper((this as Done<A>).value);\n  }\n\n  match<B1, B2 = B1, B3 = B1 | B2>(\n    this: AsyncData<A>,\n    config: {\n      Done: (value: A) => B1;\n      Loading: () => B2;\n      NotAsked: () => B3;\n    },\n  ): B1 | B2 | B3 {\n    if (this === NOT_ASKED) {\n      return config.NotAsked();\n    }\n    if (this === LOADING) {\n      return config.Loading();\n    }\n    return config.Done((this as Done<A>).value);\n  }\n\n  tap(this: AsyncData<A>, func: (asyncData: AsyncData<A>) => unknown) {\n    func(this);\n    return this;\n  }\n\n  toOption(this: AsyncData<A>): Option<A> {\n    if (this === NOT_ASKED || this === LOADING) {\n      return Option.None();\n    }\n    return Option.Some((this as Done<A>).value);\n  }\n\n  isDone(this: AsyncData<A>): this is Done<A> {\n    return this !== NOT_ASKED && this !== LOADING;\n  }\n\n  isLoading(this: AsyncData<A>): this is Loading<A> {\n    return this === LOADING;\n  }\n\n  isNotAsked(this: AsyncData<A>): this is NotAsked<A> {\n    return this === NOT_ASKED;\n  }\n\n  toJSON(this: AsyncData<A>): JsonAsyncData<A> {\n    return this.match<JsonAsyncData<A>>({\n      NotAsked: () => ({ [BOXED_TYPE]: \"AsyncData\", tag: \"NotAsked\" }),\n      Loading: () => ({ [BOXED_TYPE]: \"AsyncData\", tag: \"Loading\" }),\n      Done: (value) => ({ [BOXED_TYPE]: \"AsyncData\", tag: \"Done\", value }),\n    });\n  }\n}\n\n// @ts-expect-error\n__AsyncData.prototype.__boxed_type__ = \"AsyncData\";\n\nconst ASYNC_DATA_PROTO = __AsyncData.prototype;\n\nconst LOADING = (() => {\n  const asyncData = Object.create(ASYNC_DATA_PROTO) as Loading<unknown>;\n  // @ts-expect-error\n  asyncData.tag = \"Loading\";\n  Object.freeze(asyncData);\n  return asyncData;\n})();\n\nconst NOT_ASKED = (() => {\n  const asyncData = Object.create(ASYNC_DATA_PROTO) as NotAsked<unknown>;\n  // @ts-expect-error\n  asyncData.tag = \"NotAsked\";\n  Object.freeze(asyncData);\n  return asyncData;\n})();\n\ninterface Done<A> extends Readonly<__AsyncData<A>> {\n  readonly tag: \"Done\";\n  readonly value: A;\n}\n\ninterface Loading<A> extends Readonly<__AsyncData<A>> {\n  readonly tag: \"Loading\";\n}\n\ninterface NotAsked<A> extends Readonly<__AsyncData<A>> {\n  readonly tag: \"NotAsked\";\n}\n\nexport const AsyncData = __AsyncData;\nexport type AsyncData<A> = Done<A> | Loading<A> | NotAsked<A>;\n","import { keys, values } from \"./Dict\";\nimport { Result } from \"./OptionResult\";\nimport { LooseRecord } from \"./types\";\nimport { zip } from \"./ZipUnzip\";\n\nexport class __Future<A> {\n  /**\n   * Creates a new future from its initializer function (like `new Promise(...)`)\n   */\n  static make = <A>(\n    init: (resolver: (value: A) => void) => (() => void) | void,\n  ): Future<A> => {\n    const future = Object.create(FUTURE_PROTO) as Future<A>;\n    const resolver = (value: A) => {\n      if (future._state.tag === \"Pending\") {\n        const resolveCallbacks = future._state.resolveCallbacks;\n        future._state = { tag: \"Resolved\", value };\n        resolveCallbacks?.forEach((func) => func(value));\n      }\n    };\n    future._state = { tag: \"Pending\" };\n    future._state.cancel = init(resolver);\n    return future as Future<A>;\n  };\n\n  static isFuture = (value: unknown): value is Future<unknown> =>\n    value != null && Object.prototype.isPrototypeOf.call(FUTURE_PROTO, value);\n\n  /**\n   * Creates a future resolved to the passed value\n   */\n  static value = <A>(value: A): Future<A> => {\n    const future = Object.create(FUTURE_PROTO);\n    future._state = { tag: \"Resolved\", value };\n    return future as Future<A>;\n  };\n\n  /**\n   * Converts a Promise to a Future\\<Result\\<Value, unknown>>\n   */\n  static fromPromise<A, E = unknown>(\n    promise: Promise<A>,\n  ): Future<Result<A, E>> {\n    return Future.make((resolve) => {\n      promise.then(\n        (ok) => resolve(Result.Ok(ok)),\n        (error: E) => resolve(Result.Error(error)),\n      );\n    });\n  }\n\n  /**\n   * Turns an array of futures into a future of array\n   */\n  static all = <const Futures extends readonly Future<any>[] | []>(\n    futures: Futures,\n    propagateCancel = false,\n  ) => {\n    const length = futures.length;\n    let acc = Future.value<Array<unknown>>([]);\n    let index = 0;\n\n    while (true) {\n      if (index >= length) {\n        return acc as unknown as Future<{\n          [K in keyof Futures]: Futures[K] extends Future<infer T> ? T : never;\n        }>;\n      }\n\n      const item = futures[index];\n\n      if (item != null) {\n        acc = acc.flatMap((array) => {\n          return item.map((value) => {\n            array.push(value);\n            return array;\n          }, propagateCancel);\n        }, propagateCancel);\n      }\n\n      index++;\n    }\n  };\n\n  /**\n   * Turns an dict of futures into a future of dict\n   */\n  static allFromDict = <const Dict extends LooseRecord<Future<any>>>(\n    dict: Dict,\n  ): Future<{\n    [K in keyof Dict]: Dict[K] extends Future<infer T> ? T : never;\n  }> => {\n    const dictKeys = keys(dict);\n\n    return Future.all(values(dict)).map((values) =>\n      Object.fromEntries(zip(dictKeys, values)),\n    );\n  };\n\n  static wait = (ms: number) =>\n    Future.make<void>((resolve) => {\n      const timeoutId = setTimeout(() => resolve(), ms);\n      return () => clearTimeout(timeoutId);\n    });\n\n  static retry = <A, E>(\n    getFuture: (attempt: number) => Future<Result<A, E>>,\n    { max }: { max: number },\n  ): Future<Result<A, E>> => {\n    const run = (attempt: number): Future<Result<A, E>> =>\n      getFuture(attempt).flatMapError((error) => {\n        if (attempt + 1 < max) {\n          return run(attempt + 1);\n        } else {\n          return Future.value(Result.Error(error));\n        }\n      });\n\n    return run(0);\n  };\n\n  static concurrent = <const Futures extends readonly (() => Future<any>)[]>(\n    array: Futures,\n    { concurrency }: { concurrency: number },\n  ) => {\n    return Future.make((resolve) => {\n      const returnValue = Array(array.length);\n      let index = concurrency - 1;\n      let done = 0;\n\n      if (array.length === 0) {\n        resolve([]);\n        return;\n      }\n\n      const run = (func: () => Future<any>, currentIndex: number) =>\n        func().tap((value) => {\n          returnValue[currentIndex] = value;\n          if (++done < array.length) {\n            const next = array[++index];\n            if (next != undefined) {\n              run(next, index);\n            }\n          } else {\n            resolve(returnValue);\n          }\n        });\n\n      array.slice(0, concurrency).forEach(run);\n    }) as unknown as Future<{\n      [K in keyof Futures]: Futures[K] extends () => Future<infer T>\n        ? T\n        : never;\n    }>;\n  };\n\n  // Not accessible from the outside\n  private _state:\n    | {\n        tag: \"Pending\";\n        resolveCallbacks?: Array<(value: A) => void>;\n        cancel?: void | (() => void);\n        cancelCallbacks?: Array<() => void>;\n      }\n    | { tag: \"Cancelled\" }\n    | { tag: \"Resolved\"; value: A };\n\n  protected constructor() {\n    this._state = { tag: \"Pending\" };\n  }\n\n  /**\n   * Runs the callback with the future value when resolved\n   */\n  onResolve(func: (value: A) => void) {\n    if (this._state.tag === \"Pending\") {\n      this._state.resolveCallbacks = this._state.resolveCallbacks ?? [];\n      this._state.resolveCallbacks.push(func);\n    } else if (this._state.tag === \"Resolved\") {\n      func(this._state.value);\n    }\n  }\n\n  /**\n   * Runs the callback if and when the future is cancelled\n   */\n  onCancel(func: () => void) {\n    if (this._state.tag === \"Pending\") {\n      this._state.cancelCallbacks = this._state.cancelCallbacks ?? [];\n      this._state.cancelCallbacks.push(func);\n    } else if (this._state.tag === \"Cancelled\") {\n      func();\n    }\n  }\n\n  /**\n   * Cancels the future\n   */\n  cancel() {\n    if (this._state.tag === \"Pending\") {\n      const { cancel, cancelCallbacks } = this._state;\n      // We have to set the future as cancelled first to avoid an infinite loop\n      this._state = { tag: \"Cancelled\" };\n      if (cancel != undefined) {\n        // @ts-ignore Compiler doesn't like that `cancel` is potentially `void`\n        cancel();\n      }\n      cancelCallbacks?.forEach((func) => func());\n    }\n  }\n\n  /**\n   * Returns the Future containing the value from the callback\n   *\n   * (Future\\<A>, A => B) => Future\\<B>\n   */\n  map<B>(func: (value: A) => B, propagateCancel = false): Future<B> {\n    const future = Future.make<B>((resolve) => {\n      this.onResolve((value) => {\n        resolve(func(value));\n      });\n\n      if (propagateCancel) {\n        return () => {\n          this.cancel();\n        };\n      }\n    });\n\n    this.onCancel(() => {\n      future.cancel();\n    });\n\n    return future;\n  }\n\n  then(func: (value: A) => void) {\n    this.onResolve(func);\n    return this;\n  }\n\n  /**\n   * Returns the Future containing the value from the callback\n   *\n   * (Future\\<A>, A => Future\\<B>) => Future\\<B>\n   */\n  flatMap<B>(\n    func: (value: A) => Future<B>,\n    propagateCancel = false,\n  ): Future<B> {\n    const future = Future.make<B>((resolve) => {\n      this.onResolve((value) => {\n        const returnedFuture = func(value);\n        returnedFuture.onResolve(resolve);\n        returnedFuture.onCancel(() => future.cancel());\n      });\n\n      if (propagateCancel) {\n        return () => {\n          this.cancel();\n        };\n      }\n    });\n\n    this.onCancel(() => {\n      future.cancel();\n    });\n\n    return future;\n  }\n\n  /**\n   * Runs the callback and returns `this`\n   */\n  tap(this: Future<A>, func: (value: A) => unknown): Future<A> {\n    this.onResolve(func);\n    return this;\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Runs the callback with the value if ok and returns `this`\n   */\n  tapOk<A, E>(\n    this: Future<Result<A, E>>,\n    func: (value: A) => unknown,\n  ): Future<Result<A, E>> {\n    this.onResolve((value) => {\n      value.match({\n        Ok: (value) => func(value),\n        Error: () => {},\n      });\n    });\n\n    return this;\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Runs the callback with the error if in error and returns `this`\n   */\n  tapError<A, E>(\n    this: Future<Result<A, E>>,\n    func: (value: E) => unknown,\n  ): Future<Result<A, E>> {\n    this.onResolve((value) => {\n      value.match({\n        Ok: () => {},\n        Error: (error) => func(error),\n      });\n    });\n\n    return this;\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Takes a callback taking the Ok value and returning a new result and returns a future resolving to this new result\n   */\n  mapOkToResult<A, E, B, F>(\n    this: Future<Result<A, E>>,\n    func: (value: A) => Result<B, F>,\n    propagateCancel = false,\n  ): Future<Result<B, F | E>> {\n    return this.map((value) => {\n      return value.match({\n        Ok: (value) => func(value),\n        Error: () => value as unknown as Result<B, E | F>,\n      });\n    }, propagateCancel);\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Takes a callback taking the Error value and returning a new result and returns a future resolving to this new result\n   */\n  mapErrorToResult<A, E, B, F>(\n    this: Future<Result<A, E>>,\n    func: (value: E) => Result<B, F>,\n    propagateCancel = false,\n  ): Future<Result<A | B, F>> {\n    return this.map((value) => {\n      return value.match({\n        Error: (error) => func(error),\n        Ok: () => value as unknown as Result<A | B, F>,\n      });\n    }, propagateCancel);\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Takes a callback taking the Ok value and returning a new ok value and returns a future resolving to this new result\n   */\n  mapOk<A, E, B>(\n    this: Future<Result<A, E>>,\n    func: (value: A) => B,\n    propagateCancel = false,\n  ): Future<Result<B, E>> {\n    return this.map((value) => {\n      return value.match({\n        Ok: (value) => Result.Ok(func(value)),\n        Error: () => value as unknown as Result<B, E>,\n      });\n    }, propagateCancel);\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Takes a callback taking the Error value and returning a new error value and returns a future resolving to this new result\n   */\n  mapError<A, E, B>(\n    this: Future<Result<A, E>>,\n    func: (value: E) => B,\n    propagateCancel = false,\n  ): Future<Result<A, B>> {\n    return this.map((value) => {\n      return value.match({\n        Ok: () => value as unknown as Result<A, B>,\n        Error: (error) => Result.Error(func(error)),\n      });\n    }, propagateCancel);\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Takes a callback taking the Ok value and returning a future\n   */\n  flatMapOk<A, E, B, F>(\n    this: Future<Result<A, E>>,\n    func: (value: A) => Future<Result<B, F>>,\n    propagateCancel = false,\n  ): Future<Result<B, F | E>> {\n    return this.flatMap((value) => {\n      return value.match({\n        Ok: (value) => func(value) as Future<Result<B, F | E>>,\n        Error: () => Future.value(value as unknown as Result<B, F | E>),\n      });\n    }, propagateCancel);\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Takes a callback taking the Error value and returning a future\n   */\n  flatMapError<A, E, B, F>(\n    this: Future<Result<A, E>>,\n    func: (value: E) => Future<Result<B, F>>,\n    propagateCancel = false,\n  ): Future<Result<A | B, F>> {\n    return this.flatMap((value) => {\n      return value.match({\n        Ok: () => Future.value(value as unknown as Result<A | B, F>),\n        Error: (error) => func(error) as Future<Result<A | B, F>>,\n      });\n    }, propagateCancel);\n  }\n\n  /**\n   * Converts the future into a promise\n   */\n  toPromise(): Promise<A> {\n    return new Promise((resolve) => {\n      this.onResolve(resolve);\n    });\n  }\n\n  /**\n   * For Future<Result<*>>:\n   *\n   * Converts the future into a promise (rejecting if in Error)\n   */\n  resultToPromise<A, E>(this: Future<Result<A, E>>): Promise<A> {\n    return new Promise((resolve, reject) => {\n      this.onResolve((value) => {\n        value.match({\n          Ok: resolve,\n          Error: reject,\n        });\n      });\n    });\n  }\n}\n\nconst FUTURE_PROTO = Object.create(\n  null,\n  Object.getOwnPropertyDescriptors(__Future.prototype),\n);\n\nexport const Future = __Future;\nexport type Future<A> = __Future<A>;\n","import { Future } from \"./Future\";\n\nexport const Deferred = {\n  make<Value>() {\n    let resolve: (value: Value) => void;\n    const future = Future.make<Value>((_resolve) => {\n      resolve = _resolve;\n    });\n    // @ts-expect-error `resolver` is always defined\n    return [future, resolve] as const;\n  },\n};\n","type Ref<T> = { contents: T };\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\nexport const Lazy = <Value>(func: () => Value): { get: () => Value } => {\n  const value: Ref<Value | typeof NOT_COMPUTED> = { contents: NOT_COMPUTED };\n  return {\n    get() {\n      if (value.contents === NOT_COMPUTED) {\n        value.contents = func();\n      }\n      return value.contents;\n    },\n  };\n};\n","import { AsyncData } from \"./AsyncData\";\nimport { Option, Result } from \"./OptionResult\";\nimport { BOXED_TYPE } from \"./symbols\";\n\nexport const encode = (value: any, indent?: number | undefined) => {\n  return JSON.stringify(\n    value,\n    (key, value) => {\n      if (value == null) {\n        return value;\n      }\n      if (typeof value[BOXED_TYPE] === \"string\") {\n        return { ...value, __boxed_type__: value[BOXED_TYPE] };\n      }\n      return value;\n    },\n    indent,\n  );\n};\n\nexport const decode = (value: string) => {\n  return JSON.parse(value, function (key, value) {\n    if (value == null) {\n      return value;\n    }\n    if (value.__boxed_type__ === \"Option\") {\n      return Option.fromJSON(value);\n    }\n    if (value.__boxed_type__ === \"Result\") {\n      return Result.fromJSON(value);\n    }\n    if (value.__boxed_type__ === \"AsyncData\") {\n      return AsyncData.fromJSON(value);\n    }\n    return value;\n  });\n};\n"],"names":["keys","value","Object","values","hasOwnProperty","prototype","fromEntries","entries","dict","result","key","call","item","undefined","isSome","get","weakRefFallbackMap","WeakMap","WeakRefWithLegacyFallback","WeakRef","WeakRefWithFallback","set","this","deref","createStore","store","Map","registry","FinalizationRegistry","register","BOXED_TYPE","Symbol","zip","arrayA","arrayB","length","Math","min","array","Array","index","SomeStore","__Option","fromPredicate","predicate","Option","Some","NONE","_proto","map","func","flatMap","filter","getWithDefault","defaultValue","getOr","orElse","other","mapOr","mapper","match","config","None","tap","tapSome","toUndefined","toNull","toResult","valueWhenNone","ok","Result","Ok","Error","isNone","toJSON","_ref","tag","_ref2","P","existing","option","create","OPTION_PROTO","freeze","isOption","__boxed_type__","fromNullable","nullable","fromNull","fromUndefined","all","options","_ret","acc","_loop","v","push","allFromDict","dictKeys","equals","a","b","fromJSON","OkStore","ErrorStore","__Result","_proto2","mapError","error","flatMapError","getError","tapOk","tapError","toOption","isOk","isError","_ref3","_ref4","RESULT_PROTO","isResult","fromExecution","fromPromise","promise","Promise","resolve","then","_catch","e","reject","fromOption","results","_ret2","_loop2","defaultCompare","from","of","isArray","mapped","forEach","sortedArray","compare","low","high","mid","diff","AsyncDataStore","__AsyncData","NOT_ASKED","LOADING","AsyncData","Done","mapOkToResult","mapErrorToResult","mapOk","flatMapOk","NotAsked","Loading","isDone","isLoading","isNotAsked","asyncData","ASYNC_DATA_PROTO","asyncDatas","isAsyncData","__Future","_state","Future","make","onResolve","_this$_state$resolveC","resolveCallbacks","onCancel","_this$_state$cancelCa","cancelCallbacks","cancel","_this$_state","propagateCancel","_this","future","_this2","returnedFuture","toPromise","_this3","resultToPromise","_this4","init","FUTURE_PROTO","isFuture","isPrototypeOf","futures","wait","ms","timeoutId","setTimeout","clearTimeout","retry","getFuture","max","run","attempt","concurrent","concurrency","returnValue","done","slice","currentIndex","next","getOwnPropertyDescriptors","Deferred","_resolve","NOT_COMPUTED","Lazy","contents","indent","JSON","stringify","_extends","parse"],"mappings":"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"}