/* eslint-disable @typescript-eslint/explicit-function-return-type */
export class ToggleBitfield {
  bitfield = 0

  constructor(bitfield?: number) {
    if (bitfield) this.bitfield = bitfield
  }

  /** Tests whether or not this bitfield has the permission requested. */
  contains(bits: number) {
    return Boolean(this.bitfield & bits)
  }

  /** Adds some bits to the bitfield. */
  add(bits: number) {
    this.bitfield |= bits
    return this
  }

  /** Removes some bits from the bitfield. */
  remove(bits: number) {
    this.bitfield &= ~bits
    return this
  }
}

export class ToggleBitfieldBigint {
  bitfield = 0n

  constructor(bitfield?: bigint) {
    if (bitfield) this.bitfield = bitfield
  }

  /** Tests whether or not this bitfield has the permission requested. */
  contains(bits: bigint) {
    return Boolean(this.bitfield & bits)
  }

  /** Adds some bits to the bitfield. */
  add(bits: bigint) {
    this.bitfield |= bits
    return this
  }

  /** Removes some bits from the bitfield. */
  remove(bits: bigint) {
    this.bitfield &= ~bits
    return this
  }
}
