import {compose, EventEmitter, Property} from '@avocado/core'; const decorate = compose( EventEmitter, Property('frequency', { default: 0, }), ); export class Ticker extends decorate(class {}) { constructor(frequency = 0) { super(); this.remainder = 0; this.frequency = frequency; } remaining() { return 1 - this.remainder / this.frequency; } reset() { this.remainder = 0; } tick(elapsed) { if (0 === this.frequency) { return; } this.remainder += elapsed; if (this.remainder >= this.frequency) { const ticks = (this.remainder / this.frequency) << 0; if (ticks > 0) { this.remainder -= ticks * this.frequency; for (let i = 0; i < ticks; ++i) { this.emit('tick', this.frequency); } } } } }