export interface Counter {
promise: Promise<void[]>;
stop: () => void;
}
export function createCounter(
seconds: number,
callback?: (passed: number, left: number) => void
) {
const handlerIdList: NodeJS.Timeout[] = [];
const promiseList = [...Array(seconds + 1)].map((_, i, list) => {
const promise = new Promise<void>((resolve) => {
const id = setTimeout(() => {
callback?.(i, list.length - i - 1);
resolve();
}, i * 1000);
handlerIdList.push(id);
});
return promise;
});
const promise = Promise.all(promiseList);
const stop = () => {
handlerIdList.forEach((id) => {
clearTimeout(id);
});
};
return { promise, stop } as Counter;
}