1import { useState } from "react";
2
3export function useQueue<T>(initialValue: T[] = []) {
4 const [queue, setQueue] = useState<T[]>(initialValue);
5
6 const add = (element: T) => {
7 setQueue((q) => [...q, element]);
8 };
9
10 const remove = () => {
11 let removedElement: T | undefined;
12 setQueue((q) => {
13 const [first, ...rest] = q;
14 removedElement = first;
15 return rest;
16 });
17 return removedElement;
18 };
19
20 const clear = () => {
21 setQueue([]);
22 };
23
24 return {
25 add,
26 remove,
27 clear,
28 first: queue[0],
29 last: queue[queue.length - 1],
30 size: queue.length,
31 queue,
32 };
33}