From e95027f37712c37be243403a78ff6a327a83177e Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 5 Jun 2017 02:00:03 +0200 Subject: properly implement db resetting --- src/timer.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'src/timer.ts') diff --git a/src/timer.ts b/src/timer.ts index dd67dbd29..f19e975ac 100644 --- a/src/timer.ts +++ b/src/timer.ts @@ -75,3 +75,69 @@ export function every(delayMs: number, callback: () => void): TimerHandle { export function after(delayMs: number, callback: () => void): TimerHandle { return new TimeoutHandle(setInterval(callback, delayMs)); } + + +const nullTimerHandle = { + clear() { + } +}; + +/** + * Group of timers that can be destroyed at once. + */ +export class TimerGroup { + private stopped: boolean = false; + + private timerMap: { [index: number]: TimerHandle } = {}; + + private idGen = 1; + + stopCurrentAndFutureTimers() { + this.stopped = true; + for (const x in this.timerMap) { + if (!this.timerMap.hasOwnProperty(x)) { + continue; + } + this.timerMap[x].clear(); + delete this.timerMap[x]; + } + } + + after(delayMs: number, callback: () => void): TimerHandle { + if (this.stopped) { + console.warn("dropping timer since timer group is stopped"); + return nullTimerHandle; + } + const h = after(delayMs, callback); + let myId = this.idGen++; + this.timerMap[myId] = h; + + const tm = this.timerMap; + + return { + clear() { + h.clear(); + delete tm[myId]; + }, + }; + } + + every(delayMs: number, callback: () => void): TimerHandle { + if (this.stopped) { + console.warn("dropping timer since timer group is stopped"); + return nullTimerHandle; + } + const h = every(delayMs, callback); + let myId = this.idGen++; + this.timerMap[myId] = h; + + const tm = this.timerMap; + + return { + clear() { + h.clear(); + delete tm[myId]; + }, + }; + } +} -- cgit v1.2.3