summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/internal/freelist.ts
blob: 8faba8e68087c4a58693d149b7abe40364500201 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
// Copyright Joyent and Node contributors. All rights reserved. MIT license.

type Fn<T> = (...args: unknown[]) => T;
export class FreeList<T> {
  name: string;
  ctor: Fn<T>;
  max: number;
  list: Array<T>;
  constructor(name: string, max: number, ctor: Fn<T>) {
    this.name = name;
    this.ctor = ctor;
    this.max = max;
    this.list = [];
  }

  alloc(): T {
    return this.list.length > 0
      ? this.list.pop()
      : Reflect.apply(this.ctor, this, arguments);
  }

  free(obj: T) {
    if (this.list.length < this.max) {
      this.list.push(obj);
      return true;
    }
    return false;
  }
}