UNPKG

widjet-disposables

Version:

Lightweight disposable pattern implementation

53 lines (44 loc) 1.4 kB
export class Disposable { constructor(block) { if (!block) { throw new Error('A Disposable must be created with a dispose callback'); } this.block = block; } dispose() { if (this.block) { this.block(); delete this.block; } } } export class CompositeDisposable extends Disposable { constructor(disposables = []) { super(() => { for (let i = 0; i < this.disposables.length; i++) { const disposable = this.disposables[i]; disposable.dispose(); } }); this.disposables = disposables; } add(disposable) { this.disposables.push(disposable); } remove(disposable) { const index = this.disposables.indexOf(disposable); if (index !== -1) { this.disposables.splice(index, 1); } } } export class DisposableEvent extends Disposable { constructor(target, event, listener) { const events = event.split(/\s+/g); if (typeof target.addEventListener === 'function') { super(() => events.forEach(e => target.removeEventListener(e, listener))); events.forEach(e => target.addEventListener(e, listener)); } else if (typeof target.on === 'function') { super(() => events.forEach(e => target.off(e, listener))); events.forEach(e => target.on(e, listener)); } else { throw new Error('The passed-in source must have either a addEventListener or on method'); } } }