import {ReadableSet} from "./types/readable-set.js" import {WritableSet} from "./types/writable-set.js" import {OnSetChange} from "./types/on-set-change.js" export class RegulatedSet implements WritableSet, ReadableSet { #set: Set #on_change: (r: ReadableSet) => void #call_change() { this.#on_change(this.readable) } constructor(set: Set, on_change: OnSetChange) { this.#set = set this.#on_change = on_change } // writing methods add(...items: X[]) { for (const x of items) this.#set.add(x) this.#call_change() } delete(item: X) { this.#set.delete(item) this.#call_change() } clear() { this.#set.clear() this.#call_change() } assign(items: X[]) { this.#set.clear() for (const item of items) this.#set.add(item) this.#call_change() } // reading methods forEach(f: (item: X) => void) { this.#set.forEach(f) } has(item: X) { return this.#set.has(item) } array() { return [...this.#set] } readable: ReadableSet = { forEach: this.forEach.bind(this), has: this.has.bind(this), array: this.array.bind(this), } }