react-use/src/useQueue.ts
2020-07-02 14:19:03 -05:00

38 lines
702 B
TypeScript

import { useState } from 'react';
export interface QueueMethods<T> {
add: (item: T) => void;
remove: () => T;
first: T;
last: T;
size: number;
}
const useQueue = <T>(initialValue: T[] = []): QueueMethods<T> => {
const [state, set] = useState(initialValue);
return {
add: (value) => {
set((queue) => [...queue, value]);
},
remove: () => {
let result;
set(([first, ...rest]) => {
result = first;
return rest;
});
return result;
},
get first() {
return state[0];
},
get last() {
return state[state.length - 1];
},
get size() {
return state.length;
},
};
};
export default useQueue;