export type TimeListener = (time:number)=>void; export class Timer { private timeMs = 0; private speed = 1; private timerInterval = 1000; private direction: 'forward' | 'backward' = 'forward'; private interval: NodeJS.Timeout = null; private listeners:TimeListener[] = []; constructor(speed:number = 1,intervalMs:number = 1000) { this.speed = speed; this.timerInterval = intervalMs; } start() { if(this.interval) clearInterval(this.interval); this.interval = setInterval(this.intervalCallback.bind(this),this.timerInterval/this.speed); } stop() { clearInterval(this.interval); this.timeMs = 0; this.interval = null; this.listeners.forEach(l => l(0)); } pause() { clearInterval(this.interval); this.interval = null; } addListener(l:TimeListener) { this.listeners.push(l); } clearListeners() { this.listeners = []; } get Time() : number { return this.timeMs; } set Time(t:number){ this.timeMs = t; if(this.interval) this.start(); } get Speed() : number { return this.speed; } set Speed(s:number) { this.speed = s; if(this.interval) this.start(); } get isRunning() : boolean { return Boolean(this.interval); } set Direction(d:'forward' | 'backward') { this.direction = d; } private intervalCallback() { this.timeMs += (this.direction === 'forward' ? 1 : -1) * this.timerInterval; this.listeners.forEach(l => l(this.timeMs)); } }