import {ErrorBase} from "../errors/ErrorBase"; import {EventDispatcher} from "../events/EventDispatcher"; import {TimerEvent} from "../events/TimerEvent"; export class Timer extends EventDispatcher { private _delay:number; private _repeatCount:number = 0; private _currentCount:number = 0; private _iid; private _running:boolean = false; constructor(delay:number, repeatCount:number = 0) { super(); this._delay = delay; this._repeatCount = repeatCount; if (isNaN(delay) || delay < 0) throw new ErrorBase("Delay is negative or not a number"); } public get currentCount():number { return this._currentCount; } public get delay():number { return this._delay; } public set delay(value:number) { this._delay = value; if (this._running) { this.stop(); this.start(); } } public get repeatCount():number { return this._repeatCount; } public set repeatCount(value:number) { this._repeatCount = value; } public reset():void { if (this._running) this.stop(); this._currentCount = 0; } public get running():boolean { return this._running; } public start():void { this._running = true; clearInterval(this._iid); this._iid = setInterval(() => this.tick(), this._delay); } public stop():void { this._running = false; clearInterval(this._iid); } private tick():void { this._currentCount++; if (( this._repeatCount > 0 ) && this._currentCount >= this._repeatCount) { this.stop(); this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); this.dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE)); } else { this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); } } }