@fluentui/priority-overflow 9.0.0-beta.1 → 9.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +16 -1
- package/CHANGELOG.md +11 -2
- package/dist/index.d.ts +4 -0
- package/lib/debounce.js.map +1 -1
- package/lib/overflowManager.js +1 -0
- package/lib/overflowManager.js.map +1 -1
- package/lib/priorityQueue.js.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib-commonjs/debounce.js.map +1 -1
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/overflowManager.js +1 -0
- package/lib-commonjs/overflowManager.js.map +1 -1
- package/lib-commonjs/priorityQueue.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
"name": "@fluentui/priority-overflow",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Tue, 28 Jun 2022 15:09:21 GMT",
|
|
6
|
+
"tag": "@fluentui/priority-overflow_v9.0.0-beta.2",
|
|
7
|
+
"version": "9.0.0-beta.2",
|
|
8
|
+
"comments": {
|
|
9
|
+
"prerelease": [
|
|
10
|
+
{
|
|
11
|
+
"author": "lingfangao@hotmail.com",
|
|
12
|
+
"package": "@fluentui/priority-overflow",
|
|
13
|
+
"commit": "2da4428ae7d6e464c538b7ed10e425ce0e531144",
|
|
14
|
+
"comment": "chore: Mark internal APIs with @internal"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Mon, 23 May 2022 12:13:58 GMT",
|
|
6
21
|
"tag": "@fluentui/priority-overflow_v9.0.0-beta.1",
|
|
7
22
|
"version": "9.0.0-beta.1",
|
|
8
23
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
# Change Log - @fluentui/priority-overflow
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Tue, 28 Jun 2022 15:09:21 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## [9.0.0-beta.2](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.0.0-beta.2)
|
|
8
|
+
|
|
9
|
+
Tue, 28 Jun 2022 15:09:21 GMT
|
|
10
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/priority-overflow_v9.0.0-beta.1..@fluentui/priority-overflow_v9.0.0-beta.2)
|
|
11
|
+
|
|
12
|
+
### Changes
|
|
13
|
+
|
|
14
|
+
- chore: Mark internal APIs with @internal ([PR #23689](https://github.com/microsoft/fluentui/pull/23689) by lingfangao@hotmail.com)
|
|
15
|
+
|
|
7
16
|
## [9.0.0-beta.1](https://github.com/microsoft/fluentui/tree/@fluentui/priority-overflow_v9.0.0-beta.1)
|
|
8
17
|
|
|
9
|
-
Mon, 23 May 2022 12:
|
|
18
|
+
Mon, 23 May 2022 12:13:58 GMT
|
|
10
19
|
|
|
11
20
|
### Changes
|
|
12
21
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* @internal
|
|
2
3
|
* @returns overflow manager instance
|
|
3
4
|
*/
|
|
4
5
|
export declare function createOverflowManager(): OverflowManager;
|
|
@@ -79,6 +80,9 @@ export declare interface OverflowItemEntry {
|
|
|
79
80
|
groupId?: string;
|
|
80
81
|
}
|
|
81
82
|
|
|
83
|
+
/**
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
82
86
|
export declare interface OverflowManager {
|
|
83
87
|
/**
|
|
84
88
|
* Starts observing the container and managing the overflow state
|
package/lib/debounce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["debounce.ts"],"names":[],"mappings":"AAAA;;;;;AAKG;AACH,OAAM,SAAU,QAAV,CAAmB,EAAnB,EAA+B;
|
|
1
|
+
{"version":3,"sources":["debounce.ts"],"names":[],"mappings":"AAAA;;;;;AAKG;AACH,OAAM,SAAU,QAAV,CAAmB,EAAnB,EAA+B;EACnC,IAAI,OAAJ;EACA,OAAO,MAAK;IACV,IAAI,CAAC,OAAL,EAAc;MACZ,OAAO,GAAG,IAAV;MACA,cAAc,CAAC,MAAK;QAClB;QACA;QACA,OAAO,GAAG,KAAV;QACA,EAAE;MACH,CALa,CAAd;IAMD;EACF,CAVD;AAWD","sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function) {\n let pending: boolean;\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"],"sourceRoot":"../src/"}
|
package/lib/overflowManager.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["overflowManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n // Remove items until there's no more overlap\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() === options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n overflowItems[item.id] = item;\n visibleItemQueue.enqueue(item.id);\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n };\n}\n"],"sourceRoot":"../src/"}
|
|
1
|
+
{"version":3,"sources":["overflowManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n // Remove items until there's no more overlap\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() === options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n overflowItems[item.id] = item;\n visibleItemQueue.enqueue(item.id);\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n };\n}\n"],"sourceRoot":"../src/"}
|
package/lib/priorityQueue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["priorityQueue.ts"],"names":[],"mappings":"AAaA;;;AAGG;AACH,OAAM,SAAU,mBAAV,CAAiC,OAAjC,EAAmE;
|
|
1
|
+
{"version":3,"sources":["priorityQueue.ts"],"names":[],"mappings":"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","sourcesContent":["export type PriorityQueueCompareFn<T> = (a: T, b: T) => number;\n\nexport interface PriorityQueue<T> {\n all: () => T[];\n clear: () => void;\n contains: (item: T) => boolean;\n dequeue: () => T;\n enqueue: (item: T) => void;\n peek: () => T | null;\n remove: (item: T) => void;\n size: () => number;\n}\n\n/**\n * @param compare - comparison function for items\n * @returns Priority queue implemented with a min heap\n */\nexport function createPriorityQueue<T>(compare: PriorityQueueCompareFn<T>): PriorityQueue<T> {\n const arr: T[] = [];\n let size = 0;\n\n const left = (i: number) => {\n return 2 * i + 1;\n };\n\n const right = (i: number) => {\n return 2 * i + 2;\n };\n\n const parent = (i: number) => {\n return Math.floor((i - 1) / 2);\n };\n\n const swap = (a: number, b: number) => {\n const tmp = arr[a];\n arr[a] = arr[b];\n arr[b] = tmp;\n };\n\n const heapify = (i: number) => {\n let smallest = i;\n const l = left(i);\n const r = right(i);\n\n if (l < size && compare(arr[l], arr[smallest]) < 0) {\n smallest = l;\n }\n\n if (r < size && compare(arr[r], arr[smallest]) < 0) {\n smallest = r;\n }\n\n if (smallest !== i) {\n swap(smallest, i);\n heapify(smallest);\n }\n };\n\n const dequeue = () => {\n if (size === 0) {\n throw new Error('Priority queue empty');\n }\n\n const res = arr[0];\n arr[0] = arr[--size];\n heapify(0);\n\n return res;\n };\n\n const peek = () => {\n if (size === 0) {\n return null;\n }\n\n return arr[0];\n };\n\n const enqueue = (item: T) => {\n arr[size++] = item;\n let i = size - 1;\n let p = parent(i);\n while (i > 0 && compare(arr[p], arr[i]) > 0) {\n swap(p, i);\n i = p;\n p = parent(i);\n }\n };\n\n const contains = (item: T) => {\n return arr.indexOf(item) >= 0;\n };\n\n const remove = (item: T) => {\n const i = arr.indexOf(item);\n\n if (i === -1) {\n return;\n }\n\n arr[i] = arr[--size];\n heapify(i);\n };\n\n const clear = () => {\n size = 0;\n };\n\n const all = () => {\n return arr.slice(0, size);\n };\n\n return {\n all,\n clear,\n contains,\n dequeue,\n enqueue,\n peek,\n remove,\n size: () => size,\n };\n}\n"],"sourceRoot":"../src/"}
|
package/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"../src/","sources":["types.ts"],"names":[],"mappings":"","sourcesContent":["export type OverflowDirection = 'start' | 'end';\nexport type OverflowAxis = 'horizontal' | 'vertical';\nexport type OverflowGroupState = 'visible' | 'hidden' | 'overflow';\nexport interface OverflowItemEntry {\n /**\n * HTML element that will be disappear when overflowed\n */\n element: HTMLElement;\n /**\n * Lower priority items are invisible first when the container is overflowed\n * @default 0\n */\n priority: number;\n /**\n * Specific id, used to track visibility and provide updates to consumers\n */\n id: string;\n\n groupId?: string;\n}\n\n/**\n * signature similar to standard event listeners, but typed to handle the custom event\n */\nexport type OnUpdateOverflow = (data: OverflowEventPayload) => void;\n\nexport type OnUpdateItemVisibility = (data: OnUpdateItemVisibilityPayload) => void;\n\n/**\n * Payload of the custom DOM event for overflow updates\n */\nexport interface OverflowEventPayload {\n visibleItems: OverflowItemEntry[];\n invisibleItems: OverflowItemEntry[];\n groupVisibility: Record<string, OverflowGroupState>;\n}\n\nexport interface OnUpdateItemVisibilityPayload {\n item: OverflowItemEntry;\n visible: boolean;\n}\n\nexport interface ObserveOptions {\n /**\n * Padding (in px) at the end of the container before overflow occurs\n * Useful to account for extra elements (i.e. dropdown menu)\n * or to account for any kinds of margins between items which are hard to measure with JS\n * @default 10\n */\n padding?: number;\n /**\n * Direction where items are removed when overflow occurs\n * @default end\n */\n overflowDirection?: OverflowDirection;\n\n /**\n * Horizontal or vertical overflow\n * @default horizontal\n */\n overflowAxis?: OverflowAxis;\n\n /**\n * The minimum number of visible items\n */\n minimumVisible?: number;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateItemVisibility: OnUpdateItemVisibility;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateOverflow: OnUpdateOverflow;\n}\n\nexport interface OverflowManager {\n /**\n * Starts observing the container and managing the overflow state\n */\n observe: (container: HTMLElement, options: ObserveOptions) => void;\n /**\n * Stops observing the container\n */\n disconnect: () => void;\n /**\n * Add overflow items\n */\n addItem: (items: OverflowItemEntry) => void;\n /**\n * Remove overflow item\n */\n removeItem: (itemId: string) => void;\n /**\n * Manually update the overflow, updates are batched and async\n */\n update: () => void;\n /**\n * Manually update the overflow sync\n */\n forceUpdate: () => void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../src/","sources":["types.ts"],"names":[],"mappings":"","sourcesContent":["export type OverflowDirection = 'start' | 'end';\nexport type OverflowAxis = 'horizontal' | 'vertical';\nexport type OverflowGroupState = 'visible' | 'hidden' | 'overflow';\nexport interface OverflowItemEntry {\n /**\n * HTML element that will be disappear when overflowed\n */\n element: HTMLElement;\n /**\n * Lower priority items are invisible first when the container is overflowed\n * @default 0\n */\n priority: number;\n /**\n * Specific id, used to track visibility and provide updates to consumers\n */\n id: string;\n\n groupId?: string;\n}\n\n/**\n * signature similar to standard event listeners, but typed to handle the custom event\n */\nexport type OnUpdateOverflow = (data: OverflowEventPayload) => void;\n\nexport type OnUpdateItemVisibility = (data: OnUpdateItemVisibilityPayload) => void;\n\n/**\n * Payload of the custom DOM event for overflow updates\n */\nexport interface OverflowEventPayload {\n visibleItems: OverflowItemEntry[];\n invisibleItems: OverflowItemEntry[];\n groupVisibility: Record<string, OverflowGroupState>;\n}\n\nexport interface OnUpdateItemVisibilityPayload {\n item: OverflowItemEntry;\n visible: boolean;\n}\n\nexport interface ObserveOptions {\n /**\n * Padding (in px) at the end of the container before overflow occurs\n * Useful to account for extra elements (i.e. dropdown menu)\n * or to account for any kinds of margins between items which are hard to measure with JS\n * @default 10\n */\n padding?: number;\n /**\n * Direction where items are removed when overflow occurs\n * @default end\n */\n overflowDirection?: OverflowDirection;\n\n /**\n * Horizontal or vertical overflow\n * @default horizontal\n */\n overflowAxis?: OverflowAxis;\n\n /**\n * The minimum number of visible items\n */\n minimumVisible?: number;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateItemVisibility: OnUpdateItemVisibility;\n\n /**\n * Callback when item visibility is updated\n */\n onUpdateOverflow: OnUpdateOverflow;\n}\n\n/**\n * @internal\n */\nexport interface OverflowManager {\n /**\n * Starts observing the container and managing the overflow state\n */\n observe: (container: HTMLElement, options: ObserveOptions) => void;\n /**\n * Stops observing the container\n */\n disconnect: () => void;\n /**\n * Add overflow items\n */\n addItem: (items: OverflowItemEntry) => void;\n /**\n * Remove overflow item\n */\n removeItem: (itemId: string) => void;\n /**\n * Manually update the overflow, updates are batched and async\n */\n update: () => void;\n /**\n * Manually update the overflow sync\n */\n forceUpdate: () => void;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["debounce.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;AAKG;;AACH,SAAgB,QAAhB,CAAyB,EAAzB,EAAqC;
|
|
1
|
+
{"version":3,"sources":["debounce.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;AAKG;;AACH,SAAgB,QAAhB,CAAyB,EAAzB,EAAqC;EACnC,IAAI,OAAJ;EACA,OAAO,MAAK;IACV,IAAI,CAAC,OAAL,EAAc;MACZ,OAAO,GAAG,IAAV;MACA,cAAc,CAAC,MAAK;QAClB;QACA;QACA,OAAO,GAAG,KAAV;QACA,EAAE;MACH,CALa,CAAd;IAMD;EACF,CAVD;AAWD;;AAbD,OAAA,CAAA,QAAA,GAAA,QAAA","sourcesContent":["/**\n * Microtask debouncer\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide\n * @param fn - Function to debounce\n * @returns debounced function\n */\nexport function debounce(fn: Function) {\n let pending: boolean;\n return () => {\n if (!pending) {\n pending = true;\n queueMicrotask(() => {\n // Need to set pending to `false` before the debounced function is run.\n // React can actually interrupt the function while it's running!\n pending = false;\n fn();\n });\n }\n };\n}\n"],"sourceRoot":"../src/"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;AAAA,IAAA,iBAAA,gBAAA,OAAA,CAAA,mBAAA,CAAA;;AAAS,MAAA,CAAA,cAAA,CAAA,OAAA,EAAA,uBAAA,EAAA;
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;;AAAA,IAAA,iBAAA,gBAAA,OAAA,CAAA,mBAAA,CAAA;;AAAS,MAAA,CAAA,cAAA,CAAA,OAAA,EAAA,uBAAA,EAAA;EAAA,UAAA,EAAA,IAAA;EAAA,GAAA,EAAA,YAAA;IAAA,OAAA,iBAAA,CAAA,qBAAA;EAAqB;AAArB,CAAA","sourcesContent":["export { createOverflowManager } from './overflowManager';\nexport type {\n ObserveOptions,\n OnUpdateItemVisibility,\n OnUpdateItemVisibilityPayload,\n OnUpdateOverflow,\n OverflowAxis,\n OverflowDirection,\n OverflowEventPayload,\n OverflowGroupState,\n OverflowItemEntry,\n OverflowManager,\n} from './types';\n"],"sourceRoot":"../src/"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["overflowManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n // Remove items until there's no more overlap\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() === options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n overflowItems[item.id] = item;\n visibleItemQueue.enqueue(item.id);\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n };\n}\n"],"sourceRoot":"../src/"}
|
|
1
|
+
{"version":3,"sources":["overflowManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { debounce } from './debounce';\nimport { createPriorityQueue } from './priorityQueue';\nimport type { OverflowGroupState, OverflowItemEntry, OverflowManager, ObserveOptions } from './types';\n\n/**\n * @internal\n * @returns overflow manager instance\n */\nexport function createOverflowManager(): OverflowManager {\n let container: HTMLElement | undefined;\n const options: Required<ObserveOptions> = {\n padding: 10,\n overflowAxis: 'horizontal',\n overflowDirection: 'end',\n minimumVisible: 0,\n onUpdateItemVisibility: () => undefined,\n onUpdateOverflow: () => undefined,\n };\n\n const overflowItems: Record<string, OverflowItemEntry> = {};\n const overflowGroups: Record<string, { visibleItemIds: Set<string>; invisibleItemIds: Set<string> }> = {};\n const resizeObserver = new ResizeObserver(entries => {\n if (!entries[0] || !container) {\n return;\n }\n\n update();\n });\n\n const invisibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Higher priority at the top of the queue\n const priority = itemB.priority - itemA.priority;\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const visibleItemQueue = createPriorityQueue<string>((a, b) => {\n const itemA = overflowItems[a];\n const itemB = overflowItems[b];\n // Lower priority at the top of the queue\n const priority = itemA.priority - itemB.priority;\n\n if (priority !== 0) {\n return priority;\n }\n\n const positionStatusBit =\n options.overflowDirection === 'end' ? Node.DOCUMENT_POSITION_PRECEDING : Node.DOCUMENT_POSITION_FOLLOWING;\n\n // equal priority, use DOM order\n // eslint-disable-next-line no-bitwise\n return itemA.element.compareDocumentPosition(itemB.element) & positionStatusBit ? -1 : 1;\n });\n\n const getOffsetSize = (el: HTMLElement) => {\n return options.overflowAxis === 'horizontal' ? el.offsetWidth : el.offsetHeight;\n };\n\n const makeItemVisible = () => {\n const nextVisible = invisibleItemQueue.dequeue();\n visibleItemQueue.enqueue(nextVisible);\n\n const item = overflowItems[nextVisible];\n options.onUpdateItemVisibility({ item, visible: true });\n if (item.groupId) {\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n return getOffsetSize(item.element);\n };\n\n const makeItemInvisible = () => {\n const nextInvisible = visibleItemQueue.dequeue();\n invisibleItemQueue.enqueue(nextInvisible);\n\n const item = overflowItems[nextInvisible];\n const width = getOffsetSize(item.element);\n options.onUpdateItemVisibility({ item, visible: false });\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.add(item.id);\n }\n\n return width;\n };\n\n const dispatchOverflowUpdate = () => {\n const visibleItemIds = visibleItemQueue.all();\n const invisibleItemIds = invisibleItemQueue.all();\n\n const visibleItems = visibleItemIds.map(itemId => overflowItems[itemId]);\n const invisibleItems = invisibleItemIds.map(itemId => overflowItems[itemId]);\n\n const groupVisibility: Record<string, OverflowGroupState> = {};\n Object.entries(overflowGroups).forEach(([groupId, groupState]) => {\n if (groupState.invisibleItemIds.size && groupState.visibleItemIds.size) {\n groupVisibility[groupId] = 'overflow';\n } else if (groupState.visibleItemIds.size === 0) {\n groupVisibility[groupId] = 'hidden';\n } else {\n groupVisibility[groupId] = 'visible';\n }\n });\n\n options.onUpdateOverflow({ visibleItems, invisibleItems, groupVisibility });\n };\n\n const processOverflowItems = (availableSize: number) => {\n if (!container) {\n return;\n }\n\n // Snapshot of the visible/invisible state to compare for updates\n const visibleTop = visibleItemQueue.peek();\n const invisibleTop = invisibleItemQueue.peek();\n\n const visibleItemIds = visibleItemQueue.all();\n let currentWidth = visibleItemIds.reduce((sum, visibleItemId) => {\n const child = overflowItems[visibleItemId].element;\n return sum + getOffsetSize(child);\n }, 0);\n\n // Add items until available width is filled\n while (currentWidth < availableSize && invisibleItemQueue.size() > 0) {\n currentWidth += makeItemVisible();\n }\n // Remove items until there's no more overlap\n while (currentWidth > availableSize && visibleItemQueue.size() > 0) {\n if (visibleItemQueue.size() === options.minimumVisible) {\n break;\n }\n currentWidth -= makeItemInvisible();\n }\n\n // only update when the state of visible/invisible items has changed\n if (visibleItemQueue.peek() !== visibleTop || invisibleItemQueue.peek() !== invisibleTop) {\n dispatchOverflowUpdate();\n }\n };\n\n const forceUpdate: OverflowManager['forceUpdate'] = () => {\n if (!container) {\n return;\n }\n\n const availableSize = getOffsetSize(container) - options.padding;\n processOverflowItems(availableSize);\n };\n\n const update: OverflowManager['update'] = debounce(forceUpdate);\n\n const observe: OverflowManager['observe'] = (observedContainer, userOptions) => {\n Object.assign(options, userOptions);\n container = observedContainer;\n resizeObserver.observe(container);\n };\n\n const disconnect: OverflowManager['disconnect'] = () => {\n resizeObserver.disconnect();\n };\n\n const addItem: OverflowManager['addItem'] = item => {\n overflowItems[item.id] = item;\n visibleItemQueue.enqueue(item.id);\n\n if (item.groupId) {\n if (!overflowGroups[item.groupId]) {\n overflowGroups[item.groupId] = {\n visibleItemIds: new Set<string>(),\n invisibleItemIds: new Set<string>(),\n };\n }\n\n overflowGroups[item.groupId].visibleItemIds.add(item.id);\n }\n\n update();\n };\n\n const removeItem: OverflowManager['removeItem'] = itemId => {\n const item = overflowItems[itemId];\n visibleItemQueue.remove(itemId);\n invisibleItemQueue.remove(itemId);\n\n if (item.groupId) {\n overflowGroups[item.groupId].visibleItemIds.delete(item.id);\n overflowGroups[item.groupId].invisibleItemIds.delete(item.id);\n }\n\n delete overflowItems[itemId];\n update();\n };\n\n return {\n addItem,\n disconnect,\n forceUpdate,\n observe,\n removeItem,\n update,\n };\n}\n"],"sourceRoot":"../src/"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["priorityQueue.ts"],"names":[],"mappings":";;;;;;AAaA;;;AAGG;;AACH,SAAgB,mBAAhB,CAAuC,OAAvC,EAAyE;
|
|
1
|
+
{"version":3,"sources":["priorityQueue.ts"],"names":[],"mappings":"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","sourcesContent":["export type PriorityQueueCompareFn<T> = (a: T, b: T) => number;\n\nexport interface PriorityQueue<T> {\n all: () => T[];\n clear: () => void;\n contains: (item: T) => boolean;\n dequeue: () => T;\n enqueue: (item: T) => void;\n peek: () => T | null;\n remove: (item: T) => void;\n size: () => number;\n}\n\n/**\n * @param compare - comparison function for items\n * @returns Priority queue implemented with a min heap\n */\nexport function createPriorityQueue<T>(compare: PriorityQueueCompareFn<T>): PriorityQueue<T> {\n const arr: T[] = [];\n let size = 0;\n\n const left = (i: number) => {\n return 2 * i + 1;\n };\n\n const right = (i: number) => {\n return 2 * i + 2;\n };\n\n const parent = (i: number) => {\n return Math.floor((i - 1) / 2);\n };\n\n const swap = (a: number, b: number) => {\n const tmp = arr[a];\n arr[a] = arr[b];\n arr[b] = tmp;\n };\n\n const heapify = (i: number) => {\n let smallest = i;\n const l = left(i);\n const r = right(i);\n\n if (l < size && compare(arr[l], arr[smallest]) < 0) {\n smallest = l;\n }\n\n if (r < size && compare(arr[r], arr[smallest]) < 0) {\n smallest = r;\n }\n\n if (smallest !== i) {\n swap(smallest, i);\n heapify(smallest);\n }\n };\n\n const dequeue = () => {\n if (size === 0) {\n throw new Error('Priority queue empty');\n }\n\n const res = arr[0];\n arr[0] = arr[--size];\n heapify(0);\n\n return res;\n };\n\n const peek = () => {\n if (size === 0) {\n return null;\n }\n\n return arr[0];\n };\n\n const enqueue = (item: T) => {\n arr[size++] = item;\n let i = size - 1;\n let p = parent(i);\n while (i > 0 && compare(arr[p], arr[i]) > 0) {\n swap(p, i);\n i = p;\n p = parent(i);\n }\n };\n\n const contains = (item: T) => {\n return arr.indexOf(item) >= 0;\n };\n\n const remove = (item: T) => {\n const i = arr.indexOf(item);\n\n if (i === -1) {\n return;\n }\n\n arr[i] = arr[--size];\n heapify(i);\n };\n\n const clear = () => {\n size = 0;\n };\n\n const all = () => {\n return arr.slice(0, size);\n };\n\n return {\n all,\n clear,\n contains,\n dequeue,\n enqueue,\n peek,\n remove,\n size: () => size,\n };\n}\n"],"sourceRoot":"../src/"}
|