# DisposableStack

Source: /tuil/docs/reference/packages/core/api/disposable-stack
Locale: en

class exported by @mwillbanks/tuil-core.



{/* Generated by tooling/docs/generate-reference.ts. */}

## class [#class]

Public class exported by `@mwillbanks/tuil-core`.

```ts
export class DisposableStack implements Disposable {
  readonly #resources: Disposable[];
  #disposed: boolean;

  constructor() {
    this.#resources = [];
    this.#disposed = false;
  }

  get disposed(): boolean {
    return this.#disposed;
  }

  use<T extends Disposable>(value: T): T {
    if (this.#disposed) {
      throw new Error("Cannot add a resource to a disposed stack");
    }
    this.#resources.push(value);
    return value;
  }

  defer(dispose: Disposer): void {
    if (this.#disposed) {
      throw new Error("Cannot add a resource to a disposed stack");
    }
    this.#resources.push(toDisposable(dispose));
  }

  async dispose(): Promise<void> {
    if (this.#disposed) {
      return;
    }
    this.#disposed = true;
    const errors: unknown[] = [];
    for (const resource of this.#resources.reverse()) {
      try {
        await resource.dispose();
      } catch (error) {
        errors.push(error);
      }
    }
    this.#resources.length = 0;
    if (errors.length > 0) {
      throw new AggregateError(
        errors,
        "One or more resources failed to dispose",
      );
    }
  }
}
```

## Members [#members]

| Member          | Type                                    | Required | Description                                                                 | Related types                                                |
| --------------- | --------------------------------------- | -------- | --------------------------------------------------------------------------- | ------------------------------------------------------------ |
| `#resources`    | `Disposable[]`                          | Yes      | The `#resources` member uses the `Disposable[]` contract.                   | [`Disposable`](/tuil/docs/reference/packages/core/api/disposable) |
| `#disposed`     | `boolean`                               | Yes      | The `#disposed` member uses the `boolean` contract.                         | —                                                            |
| `__constructor` | `any`                                   | Yes      | The `__constructor` member uses the `any` contract.                         | —                                                            |
| `disposed`      | `boolean`                               | Yes      | The `disposed` member uses the `boolean` contract.                          | —                                                            |
| `use`           | `<T extends Disposable>(value: T) => T` | Yes      | The `use` member uses the `<T extends Disposable>(value: T) => T` contract. | [`Disposable`](/tuil/docs/reference/packages/core/api/disposable) |
| `defer`         | `(dispose: Disposer) => void`           | Yes      | The `defer` member uses the `(dispose: Disposer) => void` contract.         | [`Disposer`](/tuil/docs/reference/packages/core/api/disposer)     |
| `dispose`       | `() => Promise<void>`                   | Yes      | The `dispose` member uses the `() => Promise<void>` contract.               | —                                                            |

## Parameters [#parameters]

This declaration has no public members.

## Returns [#returns]

This declaration does not return a value.

## Throws [#throws]

No thrown errors are documented for this declaration.

## Related types [#related-types]

* [`Disposable`](/tuil/docs/reference/packages/core/api/disposable)
* [`Disposer`](/tuil/docs/reference/packages/core/api/disposer)

## Source [#source]

[View the secondary source reference](https://github.com/mwillbanks/tuil/blob/main/packages/core/src/disposable.ts)

## Package [#package]

[@mwillbanks/tuil-core](/tuil/docs/reference/packages/core)
