+ public constructor (
+ bucketSize: number = defaultBucketSize,
+ enablePriority = false
+ ) {
+ if (!Number.isSafeInteger(bucketSize)) {
+ throw new TypeError(
+ `Invalid bucket size: '${bucketSize}' is not an integer`
+ )
+ }
+ if (bucketSize < 0) {
+ throw new RangeError(`Invalid bucket size: ${bucketSize} < 0`)
+ }
+ this.bucketSize = bucketSize
+ this.head = this.tail = new FixedPriorityQueue(
+ this.bucketSize,
+ enablePriority
+ )
+ this.maxSize = 0
+ }
+
+ /**
+ * The priority queue size.
+ */
+ public get size (): number {
+ let node: PriorityQueueNode<T> | undefined = this.tail
+ let size = 0
+ while (node != null) {
+ size += node.size
+ node = node.next
+ }
+ return size
+ }
+
+ public get enablePriority (): boolean {
+ return this.head.enablePriority
+ }
+
+ public set enablePriority (enablePriority: boolean) {
+ if (this.head.enablePriority === enablePriority) {
+ return
+ }
+ let node: PriorityQueueNode<T> | undefined = this.tail
+ while (node != null) {
+ node.enablePriority = enablePriority
+ node = node.next
+ }
+ }
+
+ /**
+ * The number of filled prioritized buckets.
+ */
+ public get buckets (): number {
+ return Math.trunc(this.size / this.bucketSize)