/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import { Event } from 'vscode'; export interface IDisposable { dispose(): void; } export function dispose(disposables: T[]): T[] { disposables.forEach(d => d.dispose()); return []; } export function combinedDisposable(disposables: IDisposable[]): IDisposable { return { dispose: () => dispose(disposables) }; } export function mapEvent(event: Event, map: (i: I) => O): Event { return (listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables); } export function filterEvent(event: Event, filter: (e: T) => boolean): Event { return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); } export function any(...events: Event[]): Event { return (listener, thisArgs = null, disposables?) => combinedDisposable(events.map(event => event(i => listener.call(thisArgs, i), disposables))); } interface IListener { (e: T): any; } export class Emitter { private listeners: IListener[]; get event(): Event { return (listener: IListener, thisArgs = null, disposables?: IDisposable[]) => { const _listener = thisArgs ? listener.bind(thisArgs) : listener; this.listeners.push(_listener); const dispose = () => { this.listeners = this.listeners.filter(l => l !== _listener); }; const result = { dispose }; if (disposables) { disposables.push(result); } return result; }; } fire(e: T = null): void { } }