mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-18 17:22:45 -05:00
* Merge from vscode 2c306f762bf9c3db82dc06c7afaa56ef46d72f79 * Fix breaks * Extension management fixes * Fix breaks in windows bundling * Fix/skip failing tests * Update distro * Add clear to nuget.config * Add hygiene task * Bump distro * Fix hygiene issue * Add build to hygiene exclusion * Update distro * Update hygiene * Hygiene exclusions * Update tsconfig * Bump distro for server breaks * Update build config * Update darwin path * Add done calls to notebook tests * Skip failing tests * Disable smoke tests
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { Event, Disposable } from 'vscode';
|
|
|
|
export function filterEvent<T>(event: Event<T>, filter: (e: T) => boolean): Event<T> {
|
|
return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables);
|
|
}
|
|
|
|
export function onceEvent<T>(event: Event<T>): Event<T> {
|
|
return (listener, thisArgs = null, disposables?) => {
|
|
const result = event(e => {
|
|
result.dispose();
|
|
return listener.call(thisArgs, e);
|
|
}, null, disposables);
|
|
|
|
return result;
|
|
};
|
|
}
|
|
|
|
|
|
export interface PromiseAdapter<T, U> {
|
|
(
|
|
value: T,
|
|
resolve:
|
|
(value: U | PromiseLike<U>) => void,
|
|
reject:
|
|
(reason: any) => void
|
|
): any;
|
|
}
|
|
|
|
const passthrough = (value: any, resolve: (value?: any) => void) => resolve(value);
|
|
|
|
/**
|
|
* Return a promise that resolves with the next emitted event, or with some future
|
|
* event as decided by an adapter.
|
|
*
|
|
* If specified, the adapter is a function that will be called with
|
|
* `(event, resolve, reject)`. It will be called once per event until it resolves or
|
|
* rejects.
|
|
*
|
|
* The default adapter is the passthrough function `(value, resolve) => resolve(value)`.
|
|
*
|
|
* @param event the event
|
|
* @param adapter controls resolution of the returned promise
|
|
* @returns a promise that resolves or rejects as specified by the adapter
|
|
*/
|
|
export async function promiseFromEvent<T, U>(
|
|
event: Event<T>,
|
|
adapter: PromiseAdapter<T, U> = passthrough): Promise<U> {
|
|
let subscription: Disposable;
|
|
return new Promise<U>((resolve, reject) =>
|
|
subscription = event((value: T) => {
|
|
try {
|
|
Promise.resolve(adapter(value, resolve, reject))
|
|
.catch(reject);
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
})
|
|
).then(
|
|
(result: U) => {
|
|
subscription.dispose();
|
|
return result;
|
|
},
|
|
error => {
|
|
subscription.dispose();
|
|
throw error;
|
|
}
|
|
);
|
|
}
|