{"version":3,"file":"index.mjs","sources":["../../../../../src/mods/pool/index.ts"],"sourcesContent":["import { Arrays } from \"@hazae41/arrays\";\nimport { Box, Deferred, Disposer, Stack } from \"@hazae41/box\";\nimport { Future } from \"@hazae41/future\";\nimport { Nullable } from \"@hazae41/option\";\nimport { Plume, SuperEventTarget } from \"@hazae41/plume\";\nimport { Catched, Err, Ok, Result } from \"@hazae41/result\";\n\nexport class EmptyPoolError extends Error {\n  readonly #class = EmptyPoolError\n  readonly name = this.#class.name\n\n  constructor() {\n    super(`Empty pool`)\n  }\n\n}\n\nexport class EmptySlotError extends Error {\n  readonly #class = EmptySlotError\n  readonly name = this.#class.name\n\n  constructor() {\n    super(`Empty slot`)\n  }\n\n}\n\nexport class Indexed<T extends Disposable> {\n\n  constructor(\n    readonly index: number,\n    readonly value: T,\n  ) { }\n\n  [Symbol.dispose]() {\n    this.value[Symbol.dispose]()\n  }\n\n  get() {\n    return this.value\n  }\n\n}\n\nexport class PoolItem<T extends Disposable> extends Box<Indexed<T>> {\n\n  constructor(\n    readonly pool: Pool<T>,\n    readonly value: Indexed<T>,\n    readonly clean: Deferred,\n  ) {\n    super(value)\n  }\n\n  [Symbol.dispose]() {\n    if (this.dropped)\n      return\n    this.clean[Symbol.dispose]()\n\n    super[Symbol.dispose]()\n\n    this.pool.delete(this.value.index)\n  }\n\n  moveOrNull() {\n    const box = super.moveOrNull()\n\n    if (box == null)\n      return\n    this.clean[Symbol.dispose]()\n    this.pool.delete(this.value.index)\n\n    return box\n  }\n\n  moveOrThrow() {\n    const box = super.moveOrThrow()\n\n    this.clean[Symbol.dispose]()\n    this.pool.delete(this.value.index)\n\n    return box\n  }\n\n  unwrapOrNull() {\n    const value = super.unwrapOrNull()\n\n    if (value == null)\n      return\n    this.clean[Symbol.dispose]()\n    this.pool.delete(this.value.index)\n\n    return value\n  }\n\n  unwrapOrThrow() {\n    const value = super.unwrapOrThrow()\n\n    this.clean[Symbol.dispose]()\n    this.pool.delete(this.value.index)\n\n    return value\n  }\n\n  returnOrThrow(): void {\n    super.returnOrThrow()\n\n    if (!this.owned)\n      return\n\n    this.pool.update(this.value.index)\n  }\n\n}\n\nexport type PoolEvents = {\n  update: (index: number) => void\n}\n\nexport class Pool<T extends Disposable> {\n\n  readonly events = new SuperEventTarget<PoolEvents>()\n\n  /**\n   * Sparse entries by index\n   */\n  readonly #entries = new Array<Result<PoolItem<T>>>()\n\n  /**\n   * A pool of disposable items\n   */\n  constructor() { }\n\n  [Symbol.iterator]() {\n    return this.#entries.values()\n  }\n\n  [Symbol.dispose]() {\n    for (const entry of this.#entries) {\n      if (entry == null)\n        continue\n      if (entry.isErr())\n        continue\n      using _ = entry.get()\n    }\n\n    this.#entries.length = 0\n  }\n\n  #delete(index: number) {\n    const previous = this.#entries.at(index)\n\n    if (previous == null)\n      return\n\n    delete this.#entries[index]\n\n    if (previous.isErr())\n      return previous\n\n    using _ = previous.get()\n\n    return previous\n  }\n\n  /**\n   * Set the entry at the given index and return it\n   * @param index \n   * @param result \n   * @returns \n   */\n  #set(index: number, result: Result<Disposer<T>, Error>) {\n    if (result.isOk()) {\n      const { value, clean } = result.get()\n\n      const indexed = new Indexed(index, value)\n      const item = new PoolItem(this, indexed, clean)\n      const entry = new Ok(item)\n\n      this.#delete(index)\n\n      this.#entries[index] = entry\n\n      this.events.emit(\"update\", index).catch(console.error)\n\n      return entry\n    } else {\n      const value = result.getErr()\n      const entry = new Err(value)\n\n      this.#delete(index)\n\n      this.#entries[index] = entry\n\n      this.events.emit(\"update\", index).catch(console.error)\n\n      return entry\n    }\n  }\n\n  /**\n   * Set the entry at the given index and return it\n   * @param index \n   * @param result \n   * @returns \n   */\n  set(index: number, result: Result<Disposer<T>, Error>) {\n    this.#set(index, result)\n  }\n\n  /**\n   * Delete the entry at the given index and return it\n   * @param index \n   * @returns \n   */\n  delete(index: number) {\n    this.#delete(index)\n  }\n\n  update(index: number) {\n    const entry = this.#entries.at(index)\n\n    if (entry == null)\n      return\n\n    this.events.emit(\"update\", index).catch(console.error)\n  }\n\n  /**\n   * Get the entry at the given index or null if empty\n   * @param index \n   * @returns \n   */\n  getAnyOrNull(index: number): Nullable<Result<PoolItem<T>>> {\n    return this.#entries.at(index)\n  }\n\n  /**\n   * Get the entry at the given index or throw if empty\n   * @param index \n   * @returns \n   */\n  getAnyOrThrow(index: number): Result<PoolItem<T>> {\n    const entry = this.#entries.at(index)\n\n    if (entry == null)\n      throw new EmptySlotError()\n\n    return entry\n  }\n\n  /**\n   * Get the item at the given index or null if empty or errored\n   * @param index \n   * @returns \n   */\n  getOrNull(index: number): Nullable<PoolItem<T>> {\n    const entry = this.#entries.at(index)\n\n    if (entry == null)\n      return\n    if (entry.isErr())\n      return\n\n    return entry.get()\n  }\n\n  /**\n   * Get the item at the given index or throw if empty or errored\n   * @param index \n   * @returns \n   */\n  getOrThrow(index: number): PoolItem<T> {\n    const entry = this.#entries.at(index)\n\n    if (entry == null)\n      throw new EmptySlotError()\n\n    return entry.getOrThrow()\n  }\n\n  /**\n   * Get a random item or null if none available\n   * @returns \n   */\n  getRandomOrNull<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): Nullable<U> {\n    return Arrays.random(this.#entries.map(filter).filter(x => x != null))\n  }\n\n  /**\n   * Get a random item or throw if none available\n   * @returns \n   */\n  getRandomOrThrow<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): U {\n    const value = Arrays.random(this.#entries.map(filter).filter(x => x != null))\n\n    if (value == null)\n      throw new EmptyPoolError()\n\n    return value\n  }\n\n  /**\n   * Get a crypto-random item or null if none available\n   * @returns \n   */\n  getCryptoRandomOrNull<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): Nullable<U> {\n    return Arrays.cryptoRandom(this.#entries.map(filter).filter(x => x != null))\n  }\n\n  /**\n   * Get a crypto-random item or throw if none available\n   * @returns \n   */\n  getCryptoRandomOrThrow<U>(filter: (x: Result<PoolItem<T>>) => Nullable<U>): U {\n    const value = Arrays.cryptoRandom(this.#entries.map(filter).filter(x => x != null))\n\n    if (value == null)\n      throw new EmptyPoolError()\n\n    return value\n  }\n\n  async waitOrThrow<U>(index: number, filter: (x: Nullable<Result<PoolItem<T>>>) => Nullable<U>, signal: AbortSignal = new AbortController().signal): Promise<U> {\n    while (!signal.aborted) {\n      const entry = this.#entries.at(index)\n      const value = filter(entry)\n\n      if (value != null)\n        return value\n\n      await Plume.waitOrThrow(this.events, \"update\", (f: Future<void>, i) => {\n        if (i !== index)\n          return\n        f.resolve()\n      }, signal)\n    }\n\n    throw signal.reason\n  }\n\n  async waitRandomOrThrow<U>(filter: (x: Nullable<Result<PoolItem<T>>>) => Nullable<U>, signal: AbortSignal = new AbortController().signal): Promise<U> {\n    while (!signal.aborted) {\n      const entry = Arrays.random(this.#entries)\n      const value = filter(entry)\n\n      if (value != null)\n        return value\n\n      await Plume.waitOrThrow(this.events, \"update\", (f: Future<void>) => {\n        f.resolve()\n      }, signal)\n    }\n\n    throw signal.reason\n  }\n\n  async waitCryptoRandomOrThrow<U>(filter: (x: Nullable<Result<PoolItem<T>>>) => Nullable<U>, signal: AbortSignal = new AbortController().signal): Promise<U> {\n    while (!signal.aborted) {\n      const entry = Arrays.cryptoRandom(this.#entries)\n      const value = filter(entry)\n\n      if (value != null)\n        return value\n\n      await Plume.waitOrThrow(this.events, \"update\", (f: Future<void>) => {\n        f.resolve()\n      }, signal)\n    }\n\n    throw signal.reason\n  }\n\n}\n\nexport type PoolCreator<T> = (\n  index: number,\n  signal: AbortSignal,\n) => Promise<Disposer<T>>\n\nexport class StartPool<T extends Disposable> extends Pool<T> {\n\n  /**\n   * Sparse aborters by index\n   */\n  readonly #aborters = new Array<AbortController>()\n\n  /**\n   * A pool of startable items\n   */\n  constructor() {\n    super()\n  }\n\n  [Symbol.dispose]() {\n    super[Symbol.dispose]()\n\n    for (const aborter of this.#aborters)\n      aborter?.abort()\n\n    this.#aborters.length = 0\n  }\n\n  async #create(index: number, creator: PoolCreator<T>, signal: AbortSignal) {\n    try {\n      const disposer = await creator(index, signal)\n\n      using stack = new Stack()\n\n      stack.push(disposer)\n      stack.push(disposer.get())\n\n      if (signal.aborted)\n        return\n      delete this.#aborters[index]\n\n      stack.array.length = 0\n\n      super.set(index, new Ok(disposer))\n    } catch (e: unknown) {\n      if (signal.aborted)\n        return\n      delete this.#aborters[index]\n\n      const value = Catched.wrap(e)\n\n      super.set(index, new Err(value))\n    }\n  }\n\n  #start(index: number, creator: PoolCreator<T>) {\n    this.#abort(index)\n\n    const aborter = new AbortController()\n    this.#aborters[index] = aborter\n    const { signal } = aborter\n\n    this.#create(index, creator, signal)\n  }\n\n  #abort(index: number) {\n    const aborter = this.#aborters.at(index)\n\n    if (aborter != null)\n      aborter.abort()\n\n    delete this.#aborters[index]\n  }\n\n  /**\n   * Start the given index\n   * @param index \n   * @returns \n   */\n  start(index: number, creator: PoolCreator<T>) {\n    this.#start(index, creator)\n  }\n\n  /**\n   * Abort the given index\n   * @param index \n   * @returns \n   */\n  abort(index: number) {\n    this.#abort(index)\n  }\n\n}\n\nexport class AutoPool<T extends Disposable> extends StartPool<T> {\n\n  #state = \"started\"\n\n  /**\n   * An automatic pool or startable items\n   * @param creator \n   * @param capacity \n   * @returns \n   */\n  constructor(\n    readonly creator: PoolCreator<T>,\n    readonly capacity: number\n  ) {\n    super()\n\n    for (let i = 0; i < capacity; i++)\n      this.delete(i)\n\n    return this\n  }\n\n  [Symbol.dispose]() {\n    this.#state = \"stopped\"\n    super[Symbol.dispose]()\n  }\n\n  set(index: number, result: Result<Disposer<T>, Error>): never {\n    throw new Error(\"Disallowed\")\n  }\n\n  start(index: number, creator: PoolCreator<T>): never {\n    throw new Error(\"Disallowed\")\n  }\n\n  abort(index: number): never {\n    throw new Error(\"Disallowed\")\n  }\n\n  delete(index: number): void {\n    if (index >= this.capacity)\n      return\n\n    super.set(index, new Err(new EmptySlotError()))\n\n    if (this.#state === \"stopped\")\n      return\n\n    super.start(index, this.creator)\n  }\n\n}"],"names":[],"mappings":"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"}