diff --git a/src/vs/base/browser/event.ts b/src/vs/base/browser/event.ts index ba6349a1471..96297831e74 100644 --- a/src/vs/base/browser/event.ts +++ b/src/vs/base/browser/event.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Emitter, mapEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; export type EventHandler = HTMLElement | HTMLDocument | Window; @@ -32,7 +32,7 @@ export interface CancellableEvent { } export function stop(event: Event): Event { - return mapEvent(event, e => { + return Event.map(event, e => { e.preventDefault(); e.stopPropagation(); return e; diff --git a/src/vs/base/browser/ui/centered/centeredViewLayout.ts b/src/vs/base/browser/ui/centered/centeredViewLayout.ts index 7964af23c07..1b1710bed0c 100644 --- a/src/vs/base/browser/ui/centered/centeredViewLayout.ts +++ b/src/vs/base/browser/ui/centered/centeredViewLayout.ts @@ -5,7 +5,7 @@ import { SplitView, Orientation, ISplitViewStyles, IView as ISplitViewView } from 'vs/base/browser/ui/splitview/splitview'; import { $ } from 'vs/base/browser/dom'; -import { Event, mapEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IView } from 'vs/base/browser/ui/grid/gridview'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; @@ -39,7 +39,7 @@ function toSplitViewView(view: IView, getHeight: () => number): ISplitViewView { element: view.element, get maximumSize() { return view.maximumWidth; }, get minimumSize() { return view.minimumWidth; }, - onDidChange: mapEvent(view.onDidChange, e => e && e.width), + onDidChange: Event.map(view.onDidChange, e => e && e.width), layout: size => view.layout(size, getHeight()) }; } diff --git a/src/vs/base/browser/ui/grid/gridview.ts b/src/vs/base/browser/ui/grid/gridview.ts index f0ac2e0984d..275d9a118a7 100644 --- a/src/vs/base/browser/ui/grid/gridview.ts +++ b/src/vs/base/browser/ui/grid/gridview.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./gridview'; -import { Event, anyEvent, Emitter, mapEvent, Relay } from 'vs/base/common/event'; +import { Event, Emitter, Relay } from 'vs/base/common/event'; import { Orientation, Sash } from 'vs/base/browser/ui/sash/sash'; import { SplitView, IView as ISplitView, Sizing, LayoutPriority, ISplitViewStyles } from 'vs/base/browser/ui/splitview/splitview'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -150,7 +150,7 @@ class BranchNode implements ISplitView, IDisposable { this.splitview = new SplitView(this.element, { orientation, styles }); this.splitview.layout(size); - const onDidSashReset = mapEvent(this.splitview.onDidSashReset, i => [i]); + const onDidSashReset = Event.map(this.splitview.onDidSashReset, i => [i]); this.splitviewSashResetDisposable = onDidSashReset(this._onDidSashReset.fire, this._onDidSashReset); } @@ -300,11 +300,11 @@ class BranchNode implements ISplitView, IDisposable { } private onDidChildrenChange(): void { - const onDidChildrenChange = anyEvent(...this.children.map(c => c.onDidChange)); + const onDidChildrenChange = Event.any(...this.children.map(c => c.onDidChange)); this.childrenChangeDisposable.dispose(); this.childrenChangeDisposable = onDidChildrenChange(this._onDidChange.fire, this._onDidChange); - const onDidChildrenSashReset = anyEvent(...this.children.map((c, i) => mapEvent(c.onDidSashReset, location => [i, ...location]))); + const onDidChildrenSashReset = Event.any(...this.children.map((c, i) => Event.map(c.onDidSashReset, location => [i, ...location]))); this.childrenSashResetDisposable.dispose(); this.childrenSashResetDisposable = onDidChildrenSashReset(this._onDidSashReset.fire, this._onDidSashReset); @@ -414,8 +414,8 @@ class LeafNode implements ISplitView, IDisposable { ) { this._orthogonalSize = orthogonalSize; - this._onDidViewChange = mapEvent(this.view.onDidChange, this.orientation === Orientation.HORIZONTAL ? e => e && e.width : e => e && e.height); - this.onDidChange = anyEvent(this._onDidViewChange, this._onDidSetLinkedNode.event, this._onDidLinkedWidthNodeChange.event, this._onDidLinkedHeightNodeChange.event); + this._onDidViewChange = Event.map(this.view.onDidChange, this.orientation === Orientation.HORIZONTAL ? e => e && e.width : e => e && e.height); + this.onDidChange = Event.any(this._onDidViewChange, this._onDidSetLinkedNode.event, this._onDidLinkedWidthNodeChange.event, this._onDidLinkedHeightNodeChange.event); } get width(): number { @@ -547,7 +547,7 @@ export class GridView implements IDisposable { this._root = root; this.element.appendChild(root.element); this.onDidSashResetRelay.input = root.onDidSashReset; - this._onDidChange.input = mapEvent(root.onDidChange, () => undefined); // TODO + this._onDidChange.input = Event.map(root.onDidChange, () => undefined); // TODO } get orientation(): Orientation { diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index b218825a865..a251268c088 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -9,7 +9,7 @@ import { range } from 'vs/base/common/arrays'; import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent } from './list'; import { List, IListStyles, IListOptions } from './listWidget'; import { IPagedModel } from 'vs/base/common/paging'; -import { Event, mapEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; export interface IPagedRenderer extends IListRenderer { @@ -118,23 +118,23 @@ export class PagedList implements IDisposable { } get onFocusChange(): Event> { - return mapEvent(this.list.onFocusChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); + return Event.map(this.list.onFocusChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); } get onOpen(): Event> { - return mapEvent(this.list.onOpen, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); + return Event.map(this.list.onOpen, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); } get onSelectionChange(): Event> { - return mapEvent(this.list.onSelectionChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); + return Event.map(this.list.onSelectionChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); } get onPin(): Event> { - return mapEvent(this.list.onPin, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); + return Event.map(this.list.onPin, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); } get onContextMenu(): Event> { - return mapEvent(this.list.onContextMenu, ({ element, index, anchor, browserEvent }) => (typeof element === 'undefined' ? { element, index, anchor, browserEvent } : { element: this._model.get(element), index, anchor, browserEvent })); + return Event.map(this.list.onContextMenu, ({ element, index, anchor, browserEvent }) => (typeof element === 'undefined' ? { element, index, anchor, browserEvent } : { element: this._model.get(element), index, anchor, browserEvent })); } get model(): IPagedModel { diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 067c42934a9..486a975f47f 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -7,7 +7,7 @@ import { getOrDefault } from 'vs/base/common/objects'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Gesture, EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch'; import * as DOM from 'vs/base/browser/dom'; -import { Event, mapEvent, filterEvent, Emitter, latch } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollEvent, ScrollbarVisibility, INewScrollDimensions } from 'vs/base/common/scrollable'; @@ -84,7 +84,7 @@ export class ListView implements ISpliceable, IDisposable { private disposables: IDisposable[]; private _onDidChangeContentHeight = new Emitter(); - readonly onDidChangeContentHeight: Event = latch(this._onDidChangeContentHeight.event); + readonly onDidChangeContentHeight: Event = Event.latch(this._onDidChangeContentHeight.event); get contentHeight(): number { return this.rangeMap.size; } constructor( @@ -134,7 +134,7 @@ export class ListView implements ISpliceable, IDisposable { domEvent(this.scrollableElement.getDomNode(), 'scroll') (e => (e.target as HTMLElement).scrollTop = 0, null, this.disposables); - const onDragOver = mapEvent(domEvent(this.rowsContainer, 'dragover'), e => new DragMouseEvent(e)); + const onDragOver = Event.map(domEvent(this.rowsContainer, 'dragover'), e => new DragMouseEvent(e)); onDragOver(this.onDragOver, this, this.disposables); this.setRowLineHeight = getOrDefault(options, o => o.setRowLineHeight, DefaultOptions.setRowLineHeight); @@ -411,17 +411,17 @@ export class ListView implements ISpliceable, IDisposable { // Events - @memoize get onMouseClick(): Event> { return mapEvent(domEvent(this.domNode, 'click'), e => this.toMouseEvent(e)); } - @memoize get onMouseDblClick(): Event> { return mapEvent(domEvent(this.domNode, 'dblclick'), e => this.toMouseEvent(e)); } - @memoize get onMouseMiddleClick(): Event> { return filterEvent(mapEvent(domEvent(this.domNode, 'auxclick'), e => this.toMouseEvent(e as MouseEvent)), e => e.browserEvent.button === 1); } - @memoize get onMouseUp(): Event> { return mapEvent(domEvent(this.domNode, 'mouseup'), e => this.toMouseEvent(e)); } - @memoize get onMouseDown(): Event> { return mapEvent(domEvent(this.domNode, 'mousedown'), e => this.toMouseEvent(e)); } - @memoize get onMouseOver(): Event> { return mapEvent(domEvent(this.domNode, 'mouseover'), e => this.toMouseEvent(e)); } - @memoize get onMouseMove(): Event> { return mapEvent(domEvent(this.domNode, 'mousemove'), e => this.toMouseEvent(e)); } - @memoize get onMouseOut(): Event> { return mapEvent(domEvent(this.domNode, 'mouseout'), e => this.toMouseEvent(e)); } - @memoize get onContextMenu(): Event> { return mapEvent(domEvent(this.domNode, 'contextmenu'), e => this.toMouseEvent(e)); } - @memoize get onTouchStart(): Event> { return mapEvent(domEvent(this.domNode, 'touchstart'), e => this.toTouchEvent(e)); } - @memoize get onTap(): Event> { return mapEvent(domEvent(this.rowsContainer, TouchEventType.Tap), e => this.toGestureEvent(e)); } + @memoize get onMouseClick(): Event> { return Event.map(domEvent(this.domNode, 'click'), e => this.toMouseEvent(e)); } + @memoize get onMouseDblClick(): Event> { return Event.map(domEvent(this.domNode, 'dblclick'), e => this.toMouseEvent(e)); } + @memoize get onMouseMiddleClick(): Event> { return Event.filter(Event.map(domEvent(this.domNode, 'auxclick'), e => this.toMouseEvent(e as MouseEvent)), e => e.browserEvent.button === 1); } + @memoize get onMouseUp(): Event> { return Event.map(domEvent(this.domNode, 'mouseup'), e => this.toMouseEvent(e)); } + @memoize get onMouseDown(): Event> { return Event.map(domEvent(this.domNode, 'mousedown'), e => this.toMouseEvent(e)); } + @memoize get onMouseOver(): Event> { return Event.map(domEvent(this.domNode, 'mouseover'), e => this.toMouseEvent(e)); } + @memoize get onMouseMove(): Event> { return Event.map(domEvent(this.domNode, 'mousemove'), e => this.toMouseEvent(e)); } + @memoize get onMouseOut(): Event> { return Event.map(domEvent(this.domNode, 'mouseout'), e => this.toMouseEvent(e)); } + @memoize get onContextMenu(): Event> { return Event.map(domEvent(this.domNode, 'contextmenu'), e => this.toMouseEvent(e)); } + @memoize get onTouchStart(): Event> { return Event.map(domEvent(this.domNode, 'touchstart'), e => this.toTouchEvent(e)); } + @memoize get onTap(): Event> { return Event.map(domEvent(this.rowsContainer, TouchEventType.Tap), e => this.toGestureEvent(e)); } private toMouseEvent(browserEvent: MouseEvent): IListMouseEvent { const index = this.getItemIndexFromEventTarget(browserEvent.target || null); diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 44faa05a06b..bef6333dfd4 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -14,7 +14,7 @@ import * as platform from 'vs/base/common/platform'; import { Gesture } from 'vs/base/browser/touch'; import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { Event, Emitter, EventBufferer, chain, mapEvent, anyEvent, debounceEvent, reduceEvent } from 'vs/base/common/event'; +import { Event, Emitter, EventBufferer } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IIdentityProvider, ITypeLabelProvider } from './list'; import { ListView, IListViewOptions } from './listView'; @@ -246,7 +246,7 @@ class KeyboardController implements IDisposable { this.openController = options.openController || DefaultOpenController; - const onKeyDown = chain(domEvent(view.domNode, 'keydown')) + const onKeyDown = Event.chain(domEvent(view.domNode, 'keydown')) .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); @@ -338,7 +338,7 @@ class TypeLabelController implements IDisposable { private view: ListView, private typeLabelProvider: ITypeLabelProvider ) { - const onChar = chain(domEvent(view.domNode, 'keydown')) + const onChar = Event.chain(domEvent(view.domNode, 'keydown')) .map(event => new StandardKeyboardEvent(event)) .filter(event => { if (event.ctrlKey || event.metaKey || event.altKey) { @@ -352,8 +352,8 @@ class TypeLabelController implements IDisposable { .map(event => event.browserEvent.key) .event; - const onClear = debounceEvent(onChar, () => null, 800); - const onInput = reduceEvent(anyEvent(onChar, onClear), (r, i) => i === null ? null : ((r || '') + i)); + const onClear = Event.debounce(onChar, () => null, 800); + const onInput = Event.reduce(Event.any(onChar, onClear), (r, i) => i === null ? null : ((r || '') + i)); onInput(this.onInput, this, this.disposables); } @@ -396,7 +396,7 @@ class DOMFocusController implements IDisposable { ) { this.disposables = []; - const onKeyDown = chain(domEvent(view.domNode, 'keydown')) + const onKeyDown = Event.chain(domEvent(view.domNode, 'keydown')) .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); @@ -947,11 +947,11 @@ export class List implements ISpliceable, IDisposable { private styleController: IStyleController; @memoize get onFocusChange(): Event> { - return mapEvent(this.eventBufferer.wrapEvent(this.focus.onChange), e => this.toListEvent(e)); + return Event.map(this.eventBufferer.wrapEvent(this.focus.onChange), e => this.toListEvent(e)); } @memoize get onSelectionChange(): Event> { - return mapEvent(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e)); + return Event.map(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e)); } private _onOpen = new Emitter>(); @@ -959,7 +959,7 @@ export class List implements ISpliceable, IDisposable { private _onPin = new Emitter(); @memoize get onPin(): Event> { - return mapEvent(this._onPin.event, indexes => this.toListEvent({ indexes })); + return Event.map(this._onPin.event, indexes => this.toListEvent({ indexes })); } get onMouseClick(): Event> { return this.view.onMouseClick; } @@ -975,7 +975,7 @@ export class List implements ISpliceable, IDisposable { private didJustPressContextMenuKey: boolean = false; @memoize get onContextMenu(): Event> { - const fromKeydown = chain(domEvent(this.view.domNode, 'keydown')) + const fromKeydown = Event.chain(domEvent(this.view.domNode, 'keydown')) .map(e => new StandardKeyboardEvent(e)) .filter(e => this.didJustPressContextMenuKey = e.keyCode === KeyCode.ContextMenu || (e.shiftKey && e.keyCode === KeyCode.F10)) .filter(e => { e.preventDefault(); e.stopPropagation(); return false; }) @@ -987,7 +987,7 @@ export class List implements ISpliceable, IDisposable { }) .event; - const fromKeyup = chain(domEvent(this.view.domNode, 'keyup')) + const fromKeyup = Event.chain(domEvent(this.view.domNode, 'keyup')) .filter(() => { const didJustPressContextMenuKey = this.didJustPressContextMenuKey; this.didJustPressContextMenuKey = false; @@ -1003,12 +1003,12 @@ export class List implements ISpliceable, IDisposable { .filter(({ anchor }) => !!anchor) .event; - const fromMouse = chain(this.view.onContextMenu) + const fromMouse = Event.chain(this.view.onContextMenu) .filter(() => !this.didJustPressContextMenuKey) .map(({ element, index, browserEvent }) => ({ element, index, anchor: { x: browserEvent.clientX + 1, y: browserEvent.clientY }, browserEvent })) .event; - return anyEvent>(fromKeydown, fromKeyup, fromMouse); + return Event.any>(fromKeydown, fromKeyup, fromMouse); } get onKeyDown(): Event { return domEvent(this.view.domNode, 'keydown'); } @@ -1057,8 +1057,8 @@ export class List implements ISpliceable, IDisposable { this.disposables = [this.focus, this.selection, this.view, this._onDidDispose]; - this.onDidFocus = mapEvent(domEvent(this.view.domNode, 'focus', true), () => null!); - this.onDidBlur = mapEvent(domEvent(this.view.domNode, 'blur', true), () => null!); + this.onDidFocus = Event.map(domEvent(this.view.domNode, 'focus', true), () => null!); + this.onDidBlur = Event.map(domEvent(this.view.domNode, 'blur', true), () => null!); this.disposables.push(new DOMFocusController(this, this.view)); diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 14504ca6c2a..153daf8056a 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -6,7 +6,7 @@ import 'vs/css!./selectBoxCustom'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Event, Emitter, chain } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { KeyCode, KeyCodeUtils } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import * as dom from 'vs/base/browser/dom'; @@ -759,7 +759,7 @@ export class SelectBoxList implements ISelectBoxDelegate, IListVirtualDelegate this.selectList.length > 0) .map(e => new StandardKeyboardEvent(e)); @@ -775,7 +775,7 @@ export class SelectBoxList implements ISelectBoxDelegate, IListVirtualDelegate this.selectList.length > 0) .on(e => this.onMouseUp(e), this, this.toDispose); diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index 2aa77865f06..590bdd9d83d 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -5,7 +5,7 @@ import 'vs/css!./panelview'; import { IDisposable, dispose, combinedDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter, chain, filterEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -160,7 +160,7 @@ export abstract class Panel implements IView { this.updateHeader(); - const onHeaderKeyDown = chain(domEvent(this.header, 'keydown')) + const onHeaderKeyDown = Event.chain(domEvent(this.header, 'keydown')) .map(e => new StandardKeyboardEvent(e)); onHeaderKeyDown.filter(e => e.keyCode === KeyCode.Enter || e.keyCode === KeyCode.Space) @@ -391,7 +391,7 @@ export class PanelView extends Disposable { let shouldAnimate = false; disposables.push(scheduleAtNextAnimationFrame(() => shouldAnimate = true)); - filterEvent(panel.onDidChange, () => shouldAnimate) + Event.filter(panel.onDidChange, () => shouldAnimate) (this.setupAnimation, this, disposables); const panelItem = { panel, disposable: combinedDisposable(disposables) }; diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 0de80a6c763..521638ebc55 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -5,7 +5,7 @@ import 'vs/css!./splitview'; import { IDisposable, combinedDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { Event, mapEvent, Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import * as types from 'vs/base/common/types'; import * as dom from 'vs/base/browser/dom'; import { clamp } from 'vs/base/common/numbers'; @@ -238,11 +238,11 @@ export class SplitView extends Disposable { ? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY, alt: e.altKey } as ISashEvent) : (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX, alt: e.altKey } as ISashEvent); - const onStart = mapEvent(sash.onDidStart, sashEventMapper); + const onStart = Event.map(sash.onDidStart, sashEventMapper); const onStartDisposable = onStart(this.onSashStart, this); - const onChange = mapEvent(sash.onDidChange, sashEventMapper); + const onChange = Event.map(sash.onDidChange, sashEventMapper); const onChangeDisposable = onChange(this.onSashChange, this); - const onEnd = mapEvent(sash.onDidEnd, () => firstIndex(this.sashItems, item => item.sash === sash)); + const onEnd = Event.map(sash.onDidEnd, () => firstIndex(this.sashItems, item => item.sash === sash)); const onEndDisposable = onEnd(this.onSashEnd, this); const onDidResetDisposable = sash.onDidReset(() => this._onDidSashReset.fire(firstIndex(this.sashItems, item => item.sash === sash))); diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 130b0a0c428..2b59e2c7155 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -8,7 +8,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IListOptions, List, IListStyles } from 'vs/base/browser/ui/list/listWidget'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { append, $, toggleClass } from 'vs/base/browser/dom'; -import { Event, Relay, chain, mapEvent } from 'vs/base/common/event'; +import { Event, Relay } from 'vs/base/common/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter } from 'vs/base/browser/ui/tree/tree'; @@ -186,12 +186,12 @@ export abstract class AbstractTree implements IDisposable protected model: ITreeModel; protected disposables: IDisposable[] = []; - get onDidChangeFocus(): Event> { return mapEvent(this.view.onFocusChange, asTreeEvent); } - get onDidChangeSelection(): Event> { return mapEvent(this.view.onSelectionChange, asTreeEvent); } + get onDidChangeFocus(): Event> { return Event.map(this.view.onFocusChange, asTreeEvent); } + get onDidChangeSelection(): Event> { return Event.map(this.view.onSelectionChange, asTreeEvent); } - get onMouseClick(): Event> { return mapEvent(this.view.onMouseClick, asTreeMouseEvent); } - get onMouseDblClick(): Event> { return mapEvent(this.view.onMouseDblClick, asTreeMouseEvent); } - get onContextMenu(): Event> { return mapEvent(this.view.onContextMenu, asTreeContextMenuEvent); } + get onMouseClick(): Event> { return Event.map(this.view.onMouseClick, asTreeMouseEvent); } + get onMouseDblClick(): Event> { return Event.map(this.view.onMouseDblClick, asTreeMouseEvent); } + get onContextMenu(): Event> { return Event.map(this.view.onContextMenu, asTreeContextMenuEvent); } get onDidFocus(): Event { return this.view.onDidFocus; } get onDidBlur(): Event { return this.view.onDidBlur; } @@ -220,7 +220,7 @@ export abstract class AbstractTree implements IDisposable this.view.onMouseClick(this.reactOnMouseClick, this, this.disposables); if (options.keyboardSupport !== false) { - const onKeyDown = chain(this.view.onKeyDown) + const onKeyDown = Event.chain(this.view.onKeyDown) .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index d3e2f467e3a..692818d1a8f 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -8,7 +8,7 @@ import { ObjectTree, IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTr import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; import { ITreeElement, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Emitter, Event, mapEvent } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { timeout, always } from 'vs/base/common/async'; import { IListStyles } from 'vs/base/browser/ui/list/listWidget'; import { toggleClass } from 'vs/base/browser/dom'; @@ -182,16 +182,16 @@ export class AsyncDataTree, TFilterData = void> imple protected readonly disposables: IDisposable[] = []; - get onDidChangeFocus(): Event> { return mapEvent(this.tree.onDidChangeFocus, asTreeEvent); } - get onDidChangeSelection(): Event> { return mapEvent(this.tree.onDidChangeSelection, asTreeEvent); } - get onDidChangeCollapseState(): Event { return mapEvent(this.tree.onDidChangeCollapseState, e => e.element!.element!); } + get onDidChangeFocus(): Event> { return Event.map(this.tree.onDidChangeFocus, asTreeEvent); } + get onDidChangeSelection(): Event> { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); } + get onDidChangeCollapseState(): Event { return Event.map(this.tree.onDidChangeCollapseState, e => e.element!.element!); } private readonly _onDidResolveChildren = new Emitter>(); readonly onDidResolveChildren: Event> = this._onDidResolveChildren.event; - get onMouseClick(): Event> { return mapEvent(this.tree.onMouseClick, asTreeMouseEvent); } - get onMouseDblClick(): Event> { return mapEvent(this.tree.onMouseDblClick, asTreeMouseEvent); } - get onContextMenu(): Event> { return mapEvent(this.tree.onContextMenu, asTreeContextMenuEvent); } + get onMouseClick(): Event> { return Event.map(this.tree.onMouseClick, asTreeMouseEvent); } + get onMouseDblClick(): Event> { return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent); } + get onContextMenu(): Event> { return Event.map(this.tree.onContextMenu, asTreeContextMenuEvent); } get onDidFocus(): Event { return this.tree.onDidFocus; } get onDidBlur(): Event { return this.tree.onDidBlur; } diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 3aea23cf10f..7e7838c117c 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -19,6 +19,340 @@ export interface Event { export namespace Event { const _disposable = { dispose() { } }; export const None: Event = function () { return _disposable; }; + + /** + * Given an event, returns another event which only fires once. + */ + export function once(event: Event): Event { + return (listener, thisArgs = null, disposables?) => { + // we need this, in case the event fires during the listener call + let didFire = false; + + const result = event(e => { + if (didFire) { + return; + } else if (result) { + result.dispose(); + } else { + didFire = true; + } + + return listener.call(thisArgs, e); + }, null, disposables); + + if (didFire) { + result.dispose(); + } + + return result; + }; + } + + /** + * Given an event and a `map` function, returns another event which maps each element + * throught the mapping function. + */ + export function map(event: Event, map: (i: I) => O): Event { + return (listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables); + } + + /** + * Given an event and an `each` function, returns another identical event and calls + * the `each` function per each element. + */ + export function forEach(event: Event, each: (i: I) => void): Event { + return (listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables); + } + + /** + * Given an event and a `filter` function, returns another event which emits those + * elements for which the `filter` function returns `true`. + */ + export function filter(event: Event, filter: (e: T) => boolean): Event; + export function filter(event: Event, filter: (e: T | R) => e is R): Event; + export function filter(event: Event, filter: (e: T) => boolean): Event { + return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); + } + + /** + * Given an event, returns the same event but typed as `Event`. + */ + export function signal(event: Event): Event { + return event as Event as Event; + } + + /** + * Given a collection of events, returns a single event which emits + * whenever any of the provided events emit. + */ + export function any(...events: Event[]): Event { + return (listener, thisArgs = null, disposables?) => combinedDisposable(events.map(event => event(e => listener.call(thisArgs, e), null, disposables))); + } + + /** + * Given an event and a `merge` function, returns another event which maps each element + * and the cummulative result throught the `merge` function. Similar to `map`, but with memory. + */ + export function reduce(event: Event, merge: (last: O | undefined, event: I) => O): Event { + let output: O | undefined = undefined; + + return map(event, e => { + output = merge(output, e); + return output; + }); + } + + /** + * Debounces the provided event, given a `merge` function. + * + * @param event The input event. + * @param merge The reducing function. + * @param delay The debouncing delay in millis. + * @param leading Whether the event should fire in the leading phase of the timeout. + * @param leakWarningThreshold The leak warning threshold override. + */ + export function debounce(event: Event, merge: (last: T, event: T) => T, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event; + export function debounce(event: Event, merge: (last: O | undefined, event: I) => O, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event; + export function debounce(event: Event, merge: (last: O | undefined, event: I) => O, delay: number = 100, leading = false, leakWarningThreshold?: number): Event { + + let subscription: IDisposable; + let output: O | undefined = undefined; + let handle: any = undefined; + let numDebouncedCalls = 0; + + const emitter = new Emitter({ + leakWarningThreshold, + onFirstListenerAdd() { + subscription = event(cur => { + numDebouncedCalls++; + output = merge(output, cur); + + if (leading && !handle) { + emitter.fire(output); + } + + clearTimeout(handle); + handle = setTimeout(() => { + let _output = output; + output = undefined; + handle = undefined; + if (!leading || numDebouncedCalls > 1) { + emitter.fire(_output); + } + + numDebouncedCalls = 0; + }, delay); + }); + }, + onLastListenerRemove() { + subscription.dispose(); + } + }); + + return emitter.event; + } + + /** + * Given an event, it returns another event which fires only once and as soon as + * the input event emits. The event data is the number of millis it took for the + * event to fire. + */ + export function stopwatch(event: Event): Event { + const start = new Date().getTime(); + return map(once(event), _ => new Date().getTime() - start); + } + + /** + * Given an event, it returns another event which fires only when the event + * element changes. + */ + export function latch(event: Event): Event { + let firstCall = true; + let cache: T; + + return filter(event, value => { + let shouldEmit = firstCall || value !== cache; + firstCall = false; + cache = value; + return shouldEmit; + }); + } + + /** + * Buffers the provided event until a first listener comes + * along, at which point fire all the events at once and + * pipe the event from then on. + * + * ```typescript + * const emitter = new Emitter(); + * const event = emitter.event; + * const bufferedEvent = buffer(event); + * + * emitter.fire(1); + * emitter.fire(2); + * emitter.fire(3); + * // nothing... + * + * const listener = bufferedEvent(num => console.log(num)); + * // 1, 2, 3 + * + * emitter.fire(4); + * // 4 + * ``` + */ + export function buffer(event: Event, nextTick = false, _buffer: T[] = []): Event { + let buffer: T[] | null = _buffer.slice(); + + let listener: IDisposable | null = event(e => { + if (buffer) { + buffer.push(e); + } else { + emitter.fire(e); + } + }); + + const flush = () => { + if (buffer) { + buffer.forEach(e => emitter.fire(e)); + } + buffer = null; + }; + + const emitter = new Emitter({ + onFirstListenerAdd() { + if (!listener) { + listener = event(e => emitter.fire(e)); + } + }, + + onFirstListenerDidAdd() { + if (buffer) { + if (nextTick) { + setTimeout(flush); + } else { + flush(); + } + } + }, + + onLastListenerRemove() { + if (listener) { + listener.dispose(); + } + listener = null; + } + }); + + return emitter.event; + } + + /** + * Similar to `buffer` but it buffers indefinitely and repeats + * the buffered events to every new listener. + */ + export function echo(event: Event, nextTick = false, buffer: T[] = []): Event { + buffer = buffer.slice(); + + event(e => { + buffer.push(e); + emitter.fire(e); + }); + + const flush = (listener: (e: T) => any, thisArgs?: any) => buffer.forEach(e => listener.call(thisArgs, e)); + + const emitter = new Emitter({ + onListenerDidAdd(emitter, listener: (e: T) => any, thisArgs?: any) { + if (nextTick) { + setTimeout(() => flush(listener, thisArgs)); + } else { + flush(listener, thisArgs); + } + } + }); + + return emitter.event; + } + + export interface IChainableEvent { + event: Event; + map(fn: (i: T) => O): IChainableEvent; + forEach(fn: (i: T) => void): IChainableEvent; + filter(fn: (e: T) => boolean): IChainableEvent; + latch(): IChainableEvent; + on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; + once(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; + } + + class ChainableEvent implements IChainableEvent { + + get event(): Event { return this._event; } + + constructor(private _event: Event) { } + + map(fn: (i: T) => O): IChainableEvent { + return new ChainableEvent(map(this._event, fn)); + } + + forEach(fn: (i: T) => void): IChainableEvent { + return new ChainableEvent(forEach(this._event, fn)); + } + + filter(fn: (e: T) => boolean): IChainableEvent { + return new ChainableEvent(filter(this._event, fn)); + } + + latch(): IChainableEvent { + return new ChainableEvent(latch(this._event)); + } + + on(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { + return this._event(listener, thisArgs, disposables); + } + + once(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { + return once(this._event)(listener, thisArgs, disposables); + } + } + + export function chain(event: Event): IChainableEvent { + return new ChainableEvent(event); + } + + export interface NodeEventEmitter { + on(event: string | symbol, listener: Function): this; + removeListener(event: string | symbol, listener: Function): this; + } + + export function fromNodeEventEmitter(emitter: NodeEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event { + const fn = (...args: any[]) => result.fire(map(...args)); + const onFirstListenerAdd = () => emitter.on(eventName, fn); + const onLastListenerRemove = () => emitter.removeListener(eventName, fn); + const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove }); + + return result.event; + } + + export function fromPromise(promise: Thenable): Event { + const emitter = new Emitter(); + let shouldEmit = false; + + promise + .then(undefined, () => null) + .then(() => { + if (!shouldEmit) { + setTimeout(() => emitter.fire(), 0); + } else { + emitter.fire(); + } + }); + + shouldEmit = true; + return emitter.event; + } + + export function toPromise(event: Event): Thenable { + return new Promise(c => once(event)(c)); + } } type Listener = [Function, any] | Function; @@ -359,107 +693,6 @@ export class EventMultiplexer implements IDisposable { } } -export function fromPromise(promise: Thenable): Event { - const emitter = new Emitter(); - let shouldEmit = false; - - promise - .then(undefined, () => null) - .then(() => { - if (!shouldEmit) { - setTimeout(() => emitter.fire(), 0); - } else { - emitter.fire(); - } - }); - - shouldEmit = true; - return emitter.event; -} - -export function toPromise(event: Event): Thenable { - return new Promise(c => once(event)(c)); -} - -export function once(event: Event): Event { - return (listener, thisArgs = null, disposables?) => { - // we need this, in case the event fires during the listener call - let didFire = false; - - const result = event(e => { - if (didFire) { - return; - } else if (result) { - result.dispose(); - } else { - didFire = true; - } - - return listener.call(thisArgs, e); - }, null, disposables); - - if (didFire) { - result.dispose(); - } - - return result; - }; -} - -export function anyEvent(...events: Event[]): Event { - return (listener, thisArgs = null, disposables?) => combinedDisposable(events.map(event => event(e => listener.call(thisArgs, e), null, disposables))); -} - -export function reduceEvent(event: Event, merger: (last: O | undefined, event: I) => O): Event { - let output: O | undefined = undefined; - - return mapEvent(event, e => { - output = merger(output, e); - return output; - }); -} - -export function debounceEvent(event: Event, merger: (last: T, event: T) => T, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event; -export function debounceEvent(event: Event, merger: (last: O | undefined, event: I) => O, delay?: number, leading?: boolean, leakWarningThreshold?: number): Event; -export function debounceEvent(event: Event, merger: (last: O | undefined, event: I) => O, delay: number = 100, leading = false, leakWarningThreshold?: number): Event { - - let subscription: IDisposable; - let output: O | undefined = undefined; - let handle: any = undefined; - let numDebouncedCalls = 0; - - const emitter = new Emitter({ - leakWarningThreshold, - onFirstListenerAdd() { - subscription = event(cur => { - numDebouncedCalls++; - output = merger(output, cur); - - if (leading && !handle) { - emitter.fire(output); - } - - clearTimeout(handle); - handle = setTimeout(() => { - let _output = output; - output = undefined; - handle = undefined; - if (!leading || numDebouncedCalls > 1) { - emitter.fire(_output); - } - - numDebouncedCalls = 0; - }, delay); - }); - }, - onLastListenerRemove() { - subscription.dispose(); - } - }); - - return emitter.event; -} - /** * The EventBufferer is useful in situations in which you want * to delay firing your events during some code. @@ -508,169 +741,12 @@ export class EventBufferer { } } -export interface IChainableEvent { - event: Event; - map(fn: (i: T) => O): IChainableEvent; - forEach(fn: (i: T) => void): IChainableEvent; - filter(fn: (e: T) => boolean): IChainableEvent; - latch(): IChainableEvent; - on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; - once(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; -} - -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 forEach(event: Event, each: (i: I) => void): Event { - return (listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables); -} - -export function filterEvent(event: Event, filter: (e: T) => boolean): Event; -export function filterEvent(event: Event, filter: (e: T | R) => e is R): Event; -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 signalEvent(event: Event): Event { - return event as Event as Event; -} - -class ChainableEvent implements IChainableEvent { - - get event(): Event { return this._event; } - - constructor(private _event: Event) { } - - map(fn: (i: T) => O): IChainableEvent { - return new ChainableEvent(mapEvent(this._event, fn)); - } - - forEach(fn: (i: T) => void): IChainableEvent { - return new ChainableEvent(forEach(this._event, fn)); - } - - filter(fn: (e: T) => boolean): IChainableEvent { - return new ChainableEvent(filterEvent(this._event, fn)); - } - - latch(): IChainableEvent { - return new ChainableEvent(latch(this._event)); - } - - on(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { - return this._event(listener, thisArgs, disposables); - } - - once(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { - return once(this._event)(listener, thisArgs, disposables); - } -} - -export function chain(event: Event): IChainableEvent { - return new ChainableEvent(event); -} - -export function stopwatch(event: Event): Event { - const start = new Date().getTime(); - return mapEvent(once(event), _ => new Date().getTime() - start); -} - /** - * Buffers the provided event until a first listener comes - * along, at which point fire all the events at once and - * pipe the event from then on. - * - * ```typescript - * const emitter = new Emitter(); - * const event = emitter.event; - * const bufferedEvent = buffer(event); - * - * emitter.fire(1); - * emitter.fire(2); - * emitter.fire(3); - * // nothing... - * - * const listener = bufferedEvent(num => console.log(num)); - * // 1, 2, 3 - * - * emitter.fire(4); - * // 4 - * ``` + * A Relay is an event forwarder which functions as a replugabble event pipe. + * Once created, you can connect an input event to it and it will simply forward + * events from that input event through its own `event` property. The `input` + * can be changed at any point in time. */ -export function buffer(event: Event, nextTick = false, _buffer: T[] = []): Event { - let buffer: T[] | null = _buffer.slice(); - - let listener: IDisposable | null = event(e => { - if (buffer) { - buffer.push(e); - } else { - emitter.fire(e); - } - }); - - const flush = () => { - if (buffer) { - buffer.forEach(e => emitter.fire(e)); - } - buffer = null; - }; - - const emitter = new Emitter({ - onFirstListenerAdd() { - if (!listener) { - listener = event(e => emitter.fire(e)); - } - }, - - onFirstListenerDidAdd() { - if (buffer) { - if (nextTick) { - setTimeout(flush); - } else { - flush(); - } - } - }, - - onLastListenerRemove() { - if (listener) { - listener.dispose(); - } - listener = null; - } - }); - - return emitter.event; -} - -/** - * Similar to `buffer` but it buffers indefinitely and repeats - * the buffered events to every new listener. - */ -export function echo(event: Event, nextTick = false, buffer: T[] = []): Event { - buffer = buffer.slice(); - - event(e => { - buffer.push(e); - emitter.fire(e); - }); - - const flush = (listener: (e: T) => any, thisArgs?: any) => buffer.forEach(e => listener.call(thisArgs, e)); - - const emitter = new Emitter({ - onListenerDidAdd(emitter, listener: (e: T) => any, thisArgs?: any) { - if (nextTick) { - setTimeout(() => flush(listener, thisArgs)); - } else { - flush(listener, thisArgs); - } - } - }); - - return emitter.event; -} - export class Relay implements IDisposable { private listening = false; @@ -704,29 +780,3 @@ export class Relay implements IDisposable { this.emitter.dispose(); } } - -export interface NodeEventEmitter { - on(event: string | symbol, listener: Function): this; - removeListener(event: string | symbol, listener: Function): this; -} - -export function fromNodeEventEmitter(emitter: NodeEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event { - const fn = (...args: any[]) => result.fire(map(...args)); - const onFirstListenerAdd = () => emitter.on(eventName, fn); - const onLastListenerRemove = () => emitter.removeListener(eventName, fn); - const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove }); - - return result.event; -} - -export function latch(event: Event): Event { - let firstCall = true; - let cache: T; - - return filterEvent(event, value => { - let shouldEmit = firstCall || value !== cache; - firstCall = false; - cache = value; - return shouldEmit; - }); -} diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index 61da2a8eba1..48727abe9a0 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -9,7 +9,7 @@ import { nfcall, Queue } from 'vs/base/common/async'; import * as fs from 'fs'; import * as os from 'os'; import * as platform from 'vs/base/common/platform'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export function readdir(path: string): Promise { return nfcall(extfs.readdir, path); @@ -132,7 +132,7 @@ function ensureWriteFileQueue(queueKey: string): Queue { writeFileQueue = new Queue(); writeFilePathQueue[queueKey] = writeFileQueue; - const onFinish = once(writeFileQueue.onFinished); + const onFinish = Event.once(writeFileQueue.onFinished); onFinish(() => { delete writeFilePathQueue[queueKey]; writeFileQueue.dispose(); diff --git a/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts b/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts index 88b51024314..225370373a7 100644 --- a/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts +++ b/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { fromNodeEventEmitter } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IPCClient } from 'vs/base/parts/ipc/node/ipc'; import { Protocol } from 'vs/base/parts/ipc/node/ipc.electron'; import { ipcRenderer } from 'electron'; @@ -14,7 +14,7 @@ export class Client extends IPCClient implements IDisposable { private protocol: Protocol; private static createProtocol(): Protocol { - const onMessage = fromNodeEventEmitter(ipcRenderer, 'ipc:message', (_, message: string) => message); + const onMessage = Event.fromNodeEventEmitter(ipcRenderer, 'ipc:message', (_, message: string) => message); ipcRenderer.send('ipc:hello'); return new Protocol(ipcRenderer, onMessage); } diff --git a/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts b/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts index eb9cef3e413..e90f23301a4 100644 --- a/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts +++ b/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, filterEvent, mapEvent, fromNodeEventEmitter, signalEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IPCServer, ClientConnectionEvent } from 'vs/base/parts/ipc/node/ipc'; import { Protocol } from 'vs/base/parts/ipc/node/ipc.electron'; import { ipcMain } from 'electron'; @@ -14,19 +14,19 @@ interface IIPCEvent { } function createScopedOnMessageEvent(senderId: number, eventName: string): Event { - const onMessage = fromNodeEventEmitter(ipcMain, eventName, (event, message: string) => ({ event, message })); - const onMessageFromSender = filterEvent(onMessage, ({ event }) => event.sender.id === senderId); - return mapEvent(onMessageFromSender, ({ message }) => message); + const onMessage = Event.fromNodeEventEmitter(ipcMain, eventName, (event, message: string) => ({ event, message })); + const onMessageFromSender = Event.filter(onMessage, ({ event }) => event.sender.id === senderId); + return Event.map(onMessageFromSender, ({ message }) => message); } export class Server extends IPCServer { private static getOnDidClientConnect(): Event { - const onHello = fromNodeEventEmitter(ipcMain, 'ipc:hello', ({ sender }) => sender); + const onHello = Event.fromNodeEventEmitter(ipcMain, 'ipc:hello', ({ sender }) => sender); - return mapEvent(onHello, webContents => { + return Event.map(onHello, webContents => { const onMessage = createScopedOnMessageEvent(webContents.id, 'ipc:message'); - const onDidClientDisconnect = signalEvent(createScopedOnMessageEvent(webContents.id, 'ipc:disconnect')); + const onDidClientDisconnect = Event.signal(createScopedOnMessageEvent(webContents.id, 'ipc:disconnect')); const protocol = new Protocol(webContents, onMessage); return { protocol, onDidClientDisconnect }; diff --git a/src/vs/base/parts/ipc/node/ipc.cp.ts b/src/vs/base/parts/ipc/node/ipc.cp.ts index 678415bd34a..147adec58a1 100644 --- a/src/vs/base/parts/ipc/node/ipc.cp.ts +++ b/src/vs/base/parts/ipc/node/ipc.cp.ts @@ -7,7 +7,7 @@ import { ChildProcess, fork, ForkOptions } from 'child_process'; import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import { Delayer, always, createCancelablePromise } from 'vs/base/common/async'; import { deepClone, assign } from 'vs/base/common/objects'; -import { Emitter, fromNodeEventEmitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { createQueuedSender } from 'vs/base/node/processes'; import { ChannelServer as IPCServer, ChannelClient as IPCClient, IChannelClient, IChannel } from 'vs/base/parts/ipc/node/ipc'; import { isRemoteConsoleLog, log } from 'vs/base/node/console'; @@ -29,7 +29,7 @@ export class Server extends IPCServer { } } catch (e) { /* not much to do */ } }, - onMessage: fromNodeEventEmitter(process, 'message', msg => Buffer.from(msg, 'base64')) + onMessage: Event.fromNodeEventEmitter(process, 'message', msg => Buffer.from(msg, 'base64')) }, ctx); process.once('disconnect', () => this.dispose()); @@ -199,7 +199,7 @@ export class Client implements IChannelClient, IDisposable { this.child = fork(this.modulePath, args, forkOpts); const onMessageEmitter = new Emitter(); - const onRawMessage = fromNodeEventEmitter(this.child, 'message', msg => msg); + const onRawMessage = Event.fromNodeEventEmitter(this.child, 'message', msg => msg); onRawMessage(msg => { diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index ec7cb77243a..8014e7fb044 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Socket, Server as NetServer, createConnection, createServer } from 'net'; -import { Event, Emitter, once, mapEvent, fromNodeEventEmitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { IMessagePassingProtocol, ClientConnectionEvent, IPCServer, IPCClient } from 'vs/base/parts/ipc/node/ipc'; import { join } from 'path'; import { tmpdir } from 'os'; @@ -207,11 +207,11 @@ export class Protocol implements IDisposable, IMessagePassingProtocol { export class Server extends IPCServer { private static toClientConnectionEvent(server: NetServer): Event { - const onConnection = fromNodeEventEmitter(server, 'connection'); + const onConnection = Event.fromNodeEventEmitter(server, 'connection'); - return mapEvent(onConnection, socket => ({ + return Event.map(onConnection, socket => ({ protocol: new Protocol(socket), - onDidClientDisconnect: once(fromNodeEventEmitter(socket, 'close')) + onDidClientDisconnect: Event.once(Event.fromNodeEventEmitter(socket, 'close')) })); } diff --git a/src/vs/base/parts/ipc/node/ipc.ts b/src/vs/base/parts/ipc/node/ipc.ts index 50fc50bbf62..eb7ef91c707 100644 --- a/src/vs/base/parts/ipc/node/ipc.ts +++ b/src/vs/base/parts/ipc/node/ipc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, toDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter, once, toPromise, Relay } from 'vs/base/common/event'; +import { Event, Emitter, Relay } from 'vs/base/common/event'; import { always, CancelablePromise, createCancelablePromise, timeout } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; @@ -543,7 +543,7 @@ export class ChannelClient implements IChannelClient, IDisposable { if (this.state === State.Idle) { return Promise.resolve(); } else { - return toPromise(this.onDidInitialize); + return Event.toPromise(this.onDidInitialize); } } @@ -590,7 +590,7 @@ export class IPCServer implements IChannelServer, I constructor(onDidClientConnect: Event) { onDidClientConnect(({ protocol, onDidClientDisconnect }) => { - const onFirstMessage = once(protocol.onMessage); + const onFirstMessage = Event.once(protocol.onMessage); onFirstMessage(msg => { const reader = new BufferReader(msg); @@ -743,7 +743,7 @@ export class StaticRouter implements IClientRouter } } - await toPromise(hub.onDidChangeConnections); + await Event.toPromise(hub.onDidChangeConnections); return await this.route(hub); } } \ No newline at end of file diff --git a/src/vs/base/parts/ipc/test/node/ipc.test.ts b/src/vs/base/parts/ipc/test/node/ipc.test.ts index 03810849fc7..e7f8483a275 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { IMessagePassingProtocol, IPCServer, ClientConnectionEvent, IPCClient, IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; -import { Emitter, toPromise, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; import { timeout } from 'vs/base/common/async'; @@ -201,8 +201,8 @@ suite('Base IPC', function () { const b3 = Buffer.alloc(0); serverProtocol.send(b3); - const b2 = await toPromise(serverProtocol.onMessage); - const b4 = await toPromise(clientProtocol.onMessage); + const b2 = await Event.toPromise(serverProtocol.onMessage); + const b4 = await Event.toPromise(clientProtocol.onMessage); assert.strictEqual(b1, b2); assert.strictEqual(b3, b4); diff --git a/src/vs/base/parts/tree/browser/treeModel.ts b/src/vs/base/parts/tree/browser/treeModel.ts index ecfbe852b10..ec5221b58bd 100644 --- a/src/vs/base/parts/tree/browser/treeModel.ts +++ b/src/vs/base/parts/tree/browser/treeModel.ts @@ -9,7 +9,7 @@ import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import * as arrays from 'vs/base/common/arrays'; import { INavigator } from 'vs/base/common/iterator'; import * as _ from './tree'; -import { Event, Emitter, once, EventMultiplexer, Relay } from 'vs/base/common/event'; +import { Event, Emitter, EventMultiplexer, Relay } from 'vs/base/common/event'; interface IMap { [id: string]: T; } interface IItemMap extends IMap { } @@ -83,7 +83,7 @@ export class Lock { if (lock) { return new Promise((c, e) => { - once(lock.onDispose)(() => { + Event.once(lock.onDispose)(() => { return this.run(item, fn).then(c, e); }); }); diff --git a/src/vs/base/test/common/event.test.ts b/src/vs/base/test/common/event.test.ts index 19acb225e99..69522e2b2a2 100644 --- a/src/vs/base/test/common/event.test.ts +++ b/src/vs/base/test/common/event.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { Event, Emitter, debounceEvent, EventBufferer, once, fromPromise, stopwatch, buffer, echo, EventMultiplexer, latch, AsyncEmitter, IWaitUntil } from 'vs/base/common/event'; +import { Event, Emitter, EventBufferer, EventMultiplexer, AsyncEmitter, IWaitUntil } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import * as Errors from 'vs/base/common/errors'; import { timeout } from 'vs/base/common/async'; @@ -153,7 +153,7 @@ suite('Event', function () { test('Debounce Event', function (done: () => void) { let doc = new Samples.Document3(); - let onDocDidChange = debounceEvent(doc.onDidChange, (prev: string[], cur) => { + let onDocDidChange = Event.debounce(doc.onDidChange, (prev: string[], cur) => { if (!prev) { prev = [cur]; } else if (prev.indexOf(cur) < 0) { @@ -183,7 +183,7 @@ suite('Event', function () { test('Debounce Event - leading', async function () { const emitter = new Emitter(); - let debounced = debounceEvent(emitter.event, (l, e) => e, 0, /*leading=*/true); + let debounced = Event.debounce(emitter.event, (l, e) => e, 0, /*leading=*/true); let calls = 0; debounced(() => { @@ -199,7 +199,7 @@ suite('Event', function () { test('Debounce Event - leading', async function () { const emitter = new Emitter(); - let debounced = debounceEvent(emitter.event, (l, e) => e, 0, /*leading=*/true); + let debounced = Event.debounce(emitter.event, (l, e) => e, 0, /*leading=*/true); let calls = 0; debounced(() => { @@ -384,8 +384,8 @@ suite('Event utils', () => { let counter1 = 0, counter2 = 0, counter3 = 0; const listener1 = emitter.event(() => counter1++); - const listener2 = once(emitter.event)(() => counter2++); - const listener3 = once(emitter.event)(() => counter3++); + const listener2 = Event.once(emitter.event)(() => counter2++); + const listener3 = Event.once(emitter.event)(() => counter3++); assert.equal(counter1, 0); assert.equal(counter2, 0); @@ -412,7 +412,7 @@ suite('Event utils', () => { test('should emit when done', async () => { let count = 0; - const event = fromPromise(Promise.resolve(null)); + const event = Event.fromPromise(Promise.resolve(null)); event(() => count++); assert.equal(count, 0); @@ -425,7 +425,7 @@ suite('Event utils', () => { let count = 0; const promise = timeout(5); - const event = fromPromise(promise); + const event = Event.fromPromise(promise); event(() => count++); assert.equal(count, 0); @@ -438,7 +438,7 @@ suite('Event utils', () => { test('should emit', () => { const emitter = new Emitter(); - const event = stopwatch(emitter.event); + const event = Event.stopwatch(emitter.event); return new Promise((c, e) => { event(duration => { @@ -462,7 +462,7 @@ suite('Event utils', () => { const result: number[] = []; const emitter = new Emitter(); const event = emitter.event; - const bufferedEvent = buffer(event); + const bufferedEvent = Event.buffer(event); emitter.fire(1); emitter.fire(2); @@ -484,7 +484,7 @@ suite('Event utils', () => { const result: number[] = []; const emitter = new Emitter(); const event = emitter.event; - const bufferedEvent = buffer(event, true); + const bufferedEvent = Event.buffer(event, true); emitter.fire(1); emitter.fire(2); @@ -506,7 +506,7 @@ suite('Event utils', () => { const result: number[] = []; const emitter = new Emitter(); const event = emitter.event; - const bufferedEvent = buffer(event, false, [-2, -1, 0]); + const bufferedEvent = Event.buffer(event, false, [-2, -1, 0]); emitter.fire(1); emitter.fire(2); @@ -524,7 +524,7 @@ suite('Event utils', () => { const result: number[] = []; const emitter = new Emitter(); const event = emitter.event; - const echoEvent = echo(event); + const echoEvent = Event.echo(event); emitter.fire(1); emitter.fire(2); @@ -547,7 +547,7 @@ suite('Event utils', () => { const result2: number[] = []; const emitter = new Emitter(); const event = emitter.event; - const echoEvent = echo(event); + const echoEvent = Event.echo(event); emitter.fire(1); emitter.fire(2); @@ -744,7 +744,7 @@ suite('Event utils', () => { test('latch', () => { const emitter = new Emitter(); - const event = latch(emitter.event); + const event = Event.latch(emitter.event); const result: number[] = []; const listener = event(num => result.push(num)); diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index f2caa32a40b..81c1b4ba8f6 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -import { fromNodeEventEmitter } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { BrowserWindow, app } from 'electron'; type LoginEvent = { @@ -32,7 +32,7 @@ export class ProxyAuthHandler { constructor( @IWindowsMainService private windowsMainService: IWindowsMainService ) { - const onLogin = fromNodeEventEmitter(app, 'login', (event, webContents, req, authInfo, cb) => ({ event, webContents, req, authInfo, cb })); + const onLogin = Event.fromNodeEventEmitter(app, 'login', (event, webContents, req, authInfo, cb) => ({ event, webContents, req, authInfo, cb })); onLogin(this.onLogin, this, this.disposables); } diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index 9ff9e8d11dd..c4696af5f52 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -12,7 +12,7 @@ import * as modes from 'vs/editor/common/modes'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { createCancelablePromise, CancelablePromise, Delayer } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { Event, Emitter, chain } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { domEvent, stop } from 'vs/base/browser/event'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Context, provideSignatureHelp } from 'vs/editor/contrib/parameterHints/provideSignatureHelp'; @@ -321,7 +321,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { updateFont(); - chain(this.editor.onDidChangeConfiguration.bind(this.editor)) + Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor)) .filter(e => e.fontInfo) .on(updateFont, null, this.disposables); diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 357ac5b01c2..d0600a5a06f 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -29,7 +29,7 @@ import { SuggestAlternatives } from './suggestAlternatives'; import { State, SuggestModel } from './suggestModel'; import { ISelectedSuggestion, SuggestWidget } from './suggestWidget'; import { WordContextKey } from 'vs/editor/contrib/suggest/wordContextKey'; -import { once, anyEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { IdleValue } from 'vs/base/common/async'; @@ -328,11 +328,11 @@ export class SuggestController implements IEditorContribution { return textNow !== item.suggestion.insertText; }; - once(this._model.onDidTrigger)(_ => { + Event.once(this._model.onDidTrigger)(_ => { // wait for trigger because only then the cancel-event is trustworthy let listener: IDisposable[] = []; - anyEvent(this._model.onDidTrigger, this._model.onDidCancel)(() => { + Event.any(this._model.onDidTrigger, this._model.onDidCancel)(() => { // retrigger or cancel -> try to type default text dispose(listener); fallback(); diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 22449644c67..32b95b984c8 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/suggest'; import * as nls from 'vs/nls'; import { createMatches } from 'vs/base/common/filters'; import * as strings from 'vs/base/common/strings'; -import { Event, Emitter, chain } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { addClass, append, $, hide, removeClass, show, toggleClass, getDomNodePagePosition, hasClass } from 'vs/base/browser/dom'; @@ -136,7 +136,7 @@ class Renderer implements IListRenderer(this.editor.onDidChangeConfiguration.bind(this.editor)) + Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor)) .filter(e => e.fontInfo || e.contribInfo) .on(configureFont, null, data.disposables); @@ -266,7 +266,7 @@ class SuggestionDetails { this.configureFont(); - chain(this.editor.onDidChangeConfiguration.bind(this.editor)) + Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor)) .filter(e => e.fontInfo) .on(this.configureFont, this, this.disposables); diff --git a/src/vs/platform/actions/common/menu.ts b/src/vs/platform/actions/common/menu.ts index b49dac83870..94c719e3f03 100644 --- a/src/vs/platform/actions/common/menu.ts +++ b/src/vs/platform/actions/common/menu.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Emitter, filterEvent, debounceEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { MenuId, MenuRegistry, MenuItemAction, IMenu, IMenuItem, IMenuActionOptions, ISubmenuItem, SubmenuItemAction, isIMenuItem } from 'vs/platform/actions/common/actions'; @@ -28,15 +28,15 @@ export class Menu implements IMenu { // rebuild this menu whenever the menu registry reports an // event for this MenuId - debounceEvent( - filterEvent(MenuRegistry.onDidChangeMenu, menuId => menuId === this._id), + Event.debounce( + Event.filter(MenuRegistry.onDidChangeMenu, menuId => menuId === this._id), () => { }, 50 )(this._build, this, this._disposables); // when context keys change we need to check if the menu also // has changed - debounceEvent( + Event.debounce( this._contextKeyService.onDidChangeContext, (last, event) => last || event.affectsSome(this._contextKeys), 50 diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index d2d2da5045d..b68a170d2f8 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter, Event, mapEvent } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { keys } from 'vs/base/common/map'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -236,7 +236,7 @@ export abstract class AbstractContextKeyService implements IContextKeyService { public get onDidChangeContext(): Event { if (!this._onDidChangeContext) { - this._onDidChangeContext = mapEvent(this._onDidChangeContextKey.event, ((changedKeyOrKeys): IContextKeyChangeEvent => { + this._onDidChangeContext = Event.map(this._onDidChangeContextKey.event, ((changedKeyOrKeys): IContextKeyChangeEvent => { return typeof changedKeyOrKeys === 'string' ? new SimpleContextKeyChangeEvent(changedKeyOrKeys) : new ArrayContextKeyChangeEvent(changedKeyOrKeys); diff --git a/src/vs/platform/download/node/downloadIpc.ts b/src/vs/platform/download/node/downloadIpc.ts index 61e3cfd2a82..06fff141f0b 100644 --- a/src/vs/platform/download/node/downloadIpc.ts +++ b/src/vs/platform/download/node/downloadIpc.ts @@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri'; import * as path from 'path'; import * as fs from 'fs'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; -import { Event, Emitter, buffer } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { IDownloadService } from 'vs/platform/download/common/download'; import { mkdirp } from 'vs/base/node/pfs'; import { IURITransformer } from 'vs/base/common/uriIpc'; @@ -29,7 +29,7 @@ export class DownloadServiceChannel implements IServerChannel { listen(_, event: string, arg?: any): Event { switch (event) { - case 'upload': return buffer(upload(URI.revive(arg))); + case 'upload': return Event.buffer(upload(URI.revive(arg))); } throw new Error(`Event not found: ${event}`); diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index e7d9049de7e..e51d82d1ab4 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -12,7 +12,7 @@ import { IPCServer, StaticRouter } from 'vs/base/parts/ipc/node/ipc'; import { SimpleKeybinding, KeyCode } from 'vs/base/common/keyCodes'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { OS } from 'vs/base/common/platform'; -import { Emitter, toPromise } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ScanCodeBinding } from 'vs/base/common/scanCode'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; @@ -183,7 +183,7 @@ export class Driver implements IDriver, IWindowDriverRegistry { private async whenUnfrozen(windowId: number): Promise { while (this.reloadingWindowIds.has(windowId)) { - await toPromise(this.onDidReloadingChange.event); + await Event.toPromise(this.onDidReloadingChange.event); } } } diff --git a/src/vs/platform/extensionManagement/node/extensionLifecycle.ts b/src/vs/platform/extensionManagement/node/extensionLifecycle.ts index 5a641a0ae54..e78a7021a1c 100644 --- a/src/vs/platform/extensionManagement/node/extensionLifecycle.ts +++ b/src/vs/platform/extensionManagement/node/extensionLifecycle.ts @@ -10,7 +10,7 @@ import { fork, ChildProcess } from 'child_process'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { posix } from 'path'; import { Limiter } from 'vs/base/common/async'; -import { fromNodeEventEmitter, anyEvent, mapEvent, debounceEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { Schemas } from 'vs/base/common/network'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { rimraf } from 'vs/base/node/pfs'; @@ -101,19 +101,19 @@ export class ExtensionsLifecycle extends Disposable { extensionUninstallProcess.stdout.setEncoding('utf8'); extensionUninstallProcess.stderr.setEncoding('utf8'); - const onStdout = fromNodeEventEmitter(extensionUninstallProcess.stdout, 'data'); - const onStderr = fromNodeEventEmitter(extensionUninstallProcess.stderr, 'data'); + const onStdout = Event.fromNodeEventEmitter(extensionUninstallProcess.stdout, 'data'); + const onStderr = Event.fromNodeEventEmitter(extensionUninstallProcess.stderr, 'data'); // Log output onStdout(data => this.logService.info(extension.identifier.id, `post-${lifecycleType}`, data)); onStderr(data => this.logService.error(extension.identifier.id, `post-${lifecycleType}`, data)); - const onOutput = anyEvent( - mapEvent(onStdout, o => ({ data: `%c${o}`, format: [''] })), - mapEvent(onStderr, o => ({ data: `%c${o}`, format: ['color: red'] })) + const onOutput = Event.any( + Event.map(onStdout, o => ({ data: `%c${o}`, format: [''] })), + Event.map(onStderr, o => ({ data: `%c${o}`, format: ['color: red'] })) ); // Debounce all output, so we can render it in the Chrome console as a group - const onDebouncedOutput = debounceEvent(onOutput, (r, o) => { + const onDebouncedOutput = Event.debounce(onOutput, (r, o) => { return r ? { data: r.data + o.data, format: [...r.format, ...o.format] } : { data: o.data, format: o.format }; diff --git a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts index 8c2303550bf..17f5c5bb8a0 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts @@ -5,7 +5,7 @@ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, LocalExtensionType, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension } from '../common/extensionManagement'; -import { Event, buffer, mapEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { IURITransformer } from 'vs/base/common/uriIpc'; @@ -17,17 +17,17 @@ export class ExtensionManagementChannel implements IServerChannel { onDidUninstallExtension: Event; constructor(private service: IExtensionManagementService, private getUriTransformer: (requestContext: any) => IURITransformer) { - this.onInstallExtension = buffer(service.onInstallExtension, true); - this.onDidInstallExtension = buffer(service.onDidInstallExtension, true); - this.onUninstallExtension = buffer(service.onUninstallExtension, true); - this.onDidUninstallExtension = buffer(service.onDidUninstallExtension, true); + this.onInstallExtension = Event.buffer(service.onInstallExtension, true); + this.onDidInstallExtension = Event.buffer(service.onDidInstallExtension, true); + this.onUninstallExtension = Event.buffer(service.onUninstallExtension, true); + this.onDidUninstallExtension = Event.buffer(service.onDidUninstallExtension, true); } listen(context, event: string): Event { const uriTransformer = this.getUriTransformer(context); switch (event) { case 'onInstallExtension': return this.onInstallExtension; - case 'onDidInstallExtension': return mapEvent(this.onDidInstallExtension, i => ({ ...i, local: this._transformOutgoing(i.local, uriTransformer) })); + case 'onDidInstallExtension': return Event.map(this.onDidInstallExtension, i => ({ ...i, local: this._transformOutgoing(i.local, uriTransformer) })); case 'onUninstallExtension': return this.onUninstallExtension; case 'onDidUninstallExtension': return this.onDidUninstallExtension; } @@ -70,7 +70,7 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer constructor(private channel: IChannel) { } get onInstallExtension(): Event { return this.channel.listen('onInstallExtension'); } - get onDidInstallExtension(): Event { return mapEvent(this.channel.listen('onDidInstallExtension'), i => ({ ...i, local: this._transformIncoming(i.local) })); } + get onDidInstallExtension(): Event { return Event.map(this.channel.listen('onDidInstallExtension'), i => ({ ...i, local: this._transformIncoming(i.local) })); } get onUninstallExtension(): Event { return this.channel.listen('onUninstallExtension'); } get onDidUninstallExtension(): Event { return this.channel.listen('onDidUninstallExtension'); } diff --git a/src/vs/platform/localizations/node/localizationsIpc.ts b/src/vs/platform/localizations/node/localizationsIpc.ts index e4f968b3fbb..fa5a5518ae6 100644 --- a/src/vs/platform/localizations/node/localizationsIpc.ts +++ b/src/vs/platform/localizations/node/localizationsIpc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; -import { Event, buffer } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations'; export class LocalizationsChannel implements IServerChannel { @@ -12,7 +12,7 @@ export class LocalizationsChannel implements IServerChannel { onDidLanguagesChange: Event; constructor(private service: ILocalizationsService) { - this.onDidLanguagesChange = buffer(service.onDidLanguagesChange, true); + this.onDidLanguagesChange = Event.buffer(service.onDidLanguagesChange, true); } listen(_, event: string): Event { diff --git a/src/vs/platform/log/node/logIpc.ts b/src/vs/platform/log/node/logIpc.ts index 9e655ee69a6..7cb099b5021 100644 --- a/src/vs/platform/log/node/logIpc.ts +++ b/src/vs/platform/log/node/logIpc.ts @@ -5,14 +5,14 @@ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; import { LogLevel, ILogService, DelegatedLogService } from 'vs/platform/log/common/log'; -import { Event, buffer } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export class LogLevelSetterChannel implements IServerChannel { onDidChangeLogLevel: Event; constructor(private service: ILogService) { - this.onDidChangeLogLevel = buffer(service.onDidChangeLogLevel, true); + this.onDidChangeLogLevel = Event.buffer(service.onDidChangeLogLevel, true); } listen(_, event: string): Event { diff --git a/src/vs/platform/markers/common/markerService.ts b/src/vs/platform/markers/common/markerService.ts index 6781b3c09cf..515b23932c0 100644 --- a/src/vs/platform/markers/common/markerService.ts +++ b/src/vs/platform/markers/common/markerService.ts @@ -8,7 +8,7 @@ import { Schemas } from 'vs/base/common/network'; import { IDisposable } from 'vs/base/common/lifecycle'; import { isEmptyObject } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { Event, Emitter, debounceEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { IMarkerService, IMarkerData, IResourceMarker, IMarker, MarkerStatistics, MarkerSeverity } from './markers'; interface MapMap { @@ -124,7 +124,7 @@ export class MarkerService implements IMarkerService { _serviceBrand: any; private _onMarkerChanged = new Emitter(); - private _onMarkerChangedEvent: Event = debounceEvent(this._onMarkerChanged.event, MarkerService._debouncer, 0); + private _onMarkerChangedEvent: Event = Event.debounce(this._onMarkerChanged.event, MarkerService._debouncer, 0); private _byResource: MapMap = Object.create(null); private _byOwner: MapMap = Object.create(null); private _stats: MarkerStats; diff --git a/src/vs/platform/node/zip.ts b/src/vs/platform/node/zip.ts index 6e9670e9255..983770a62e9 100644 --- a/src/vs/platform/node/zip.ts +++ b/src/vs/platform/node/zip.ts @@ -13,7 +13,7 @@ import { open as _openZip, Entry, ZipFile } from 'yauzl'; import * as yazl from 'yazl'; import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export interface IExtractOptions { overwrite?: boolean; @@ -81,7 +81,7 @@ function extractEntry(stream: Readable, fileName: string, mode: number, targetPa let istream: WriteStream; - once(token.onCancellationRequested)(() => { + Event.once(token.onCancellationRequested)(() => { if (istream) { istream.destroy(); } @@ -108,7 +108,7 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log let last = createCancelablePromise(() => Promise.resolve()); let extractedEntriesCount = 0; - once(token.onCancellationRequested)(() => { + Event.once(token.onCancellationRequested)(() => { logService.debug(targetPath, 'Cancelled.'); last.cancel(); zipfile.close(); diff --git a/src/vs/platform/storage/node/storageIpc.ts b/src/vs/platform/storage/node/storageIpc.ts index 9c9ae838ee6..44ab2537c58 100644 --- a/src/vs/platform/storage/node/storageIpc.ts +++ b/src/vs/platform/storage/node/storageIpc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; -import { Event, Emitter, debounceEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { StorageMainService, IStorageChangeEvent } from 'vs/platform/storage/node/storageMainService'; import { IUpdateRequest, IStorageDatabase, IStorageItemsChangeEvent } from 'vs/base/node/storage'; import { mapToSerializable, serializableToMap, values } from 'vs/base/common/map'; @@ -40,7 +40,7 @@ export class GlobalStorageDatabaseChannel extends Disposable implements IServerC // Listen for changes in global storage to send to listeners // that are listening. Use a debouncer to reduce IPC traffic. - this._register(debounceEvent(this.storageMainService.onDidChangeStorage, (prev: IStorageChangeEvent[], cur: IStorageChangeEvent) => { + this._register(Event.debounce(this.storageMainService.onDidChangeStorage, (prev: IStorageChangeEvent[], cur: IStorageChangeEvent) => { if (!prev) { prev = [cur]; } else { diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts index be0cbd67bdc..6486902fc01 100644 --- a/src/vs/platform/update/common/update.ts +++ b/src/vs/platform/update/common/update.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, NodeEventEmitter } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -74,7 +74,7 @@ export const State = { Ready: (update: IUpdate) => ({ type: StateType.Ready, update } as Ready), }; -export interface IAutoUpdater extends NodeEventEmitter { +export interface IAutoUpdater extends Event.NodeEventEmitter { setFeedURL(url: string): void; checkForUpdates(): void; applyUpdate?(): TPromise; diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts index 2bf4b3509a8..c1d74b67d9f 100644 --- a/src/vs/platform/update/electron-main/updateService.darwin.ts +++ b/src/vs/platform/update/electron-main/updateService.darwin.ts @@ -5,7 +5,7 @@ import * as electron from 'electron'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Event, fromNodeEventEmitter } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { memoize } from 'vs/base/common/decorators'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; @@ -22,10 +22,10 @@ export class DarwinUpdateService extends AbstractUpdateService { private disposables: IDisposable[] = []; - @memoize private get onRawError(): Event { return fromNodeEventEmitter(electron.autoUpdater, 'error', (_, message) => message); } - @memoize private get onRawUpdateNotAvailable(): Event { return fromNodeEventEmitter(electron.autoUpdater, 'update-not-available'); } - @memoize private get onRawUpdateAvailable(): Event { return fromNodeEventEmitter(electron.autoUpdater, 'update-available', (_, url, version) => ({ url, version, productVersion: version })); } - @memoize private get onRawUpdateDownloaded(): Event { return fromNodeEventEmitter(electron.autoUpdater, 'update-downloaded', (_, releaseNotes, version, date) => ({ releaseNotes, version, productVersion: version, date })); } + @memoize private get onRawError(): Event { return Event.fromNodeEventEmitter(electron.autoUpdater, 'error', (_, message) => message); } + @memoize private get onRawUpdateNotAvailable(): Event { return Event.fromNodeEventEmitter(electron.autoUpdater, 'update-not-available'); } + @memoize private get onRawUpdateAvailable(): Event { return Event.fromNodeEventEmitter(electron.autoUpdater, 'update-available', (_, url, version) => ({ url, version, productVersion: version })); } + @memoize private get onRawUpdateDownloaded(): Event { return Event.fromNodeEventEmitter(electron.autoUpdater, 'update-downloaded', (_, releaseNotes, version, date) => ({ releaseNotes, version, productVersion: version, date })); } constructor( @ILifecycleService lifecycleService: ILifecycleService, diff --git a/src/vs/platform/update/electron-main/updateService.snap.ts b/src/vs/platform/update/electron-main/updateService.snap.ts index c15b406e587..62e8207ff4a 100644 --- a/src/vs/platform/update/electron-main/updateService.snap.ts +++ b/src/vs/platform/update/electron-main/updateService.snap.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Emitter, fromNodeEventEmitter, filterEvent, debounceEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { timeout } from 'vs/base/common/async'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; import product from 'vs/platform/node/product'; @@ -148,9 +148,9 @@ export class SnapUpdateService extends AbstractUpdateService2 { throw new Error(`'SNAP' environment variable not set`); } const watcher = watch(path.dirname(process.env.SNAP)); - const onChange = fromNodeEventEmitter(watcher, 'change', (_, fileName: string) => fileName); - const onCurrentChange = filterEvent(onChange, n => n === 'current'); - const onDebouncedCurrentChange = debounceEvent(onCurrentChange, (_, e) => e, 2000); + const onChange = Event.fromNodeEventEmitter(watcher, 'change', (_, fileName: string) => fileName); + const onCurrentChange = Event.filter(onChange, n => n === 'current'); + const onDebouncedCurrentChange = Event.debounce(onCurrentChange, (_, e) => e, 2000); const listener = onDebouncedCurrentChange(this.checkForUpdates, this); lifecycleService.onWillShutdown(() => { diff --git a/src/vs/platform/url/electron-main/electronUrlListener.ts b/src/vs/platform/url/electron-main/electronUrlListener.ts index bf52d3400da..4f43f22ea3e 100644 --- a/src/vs/platform/url/electron-main/electronUrlListener.ts +++ b/src/vs/platform/url/electron-main/electronUrlListener.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { mapEvent, fromNodeEventEmitter, filterEvent, once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IURLService } from 'vs/platform/url/common/url'; import product from 'vs/platform/node/product'; import { app } from 'electron'; @@ -47,15 +47,15 @@ export class ElectronURLListener { app.setAsDefaultProtocolClient(product.urlProtocol, process.execPath, ['--open-url', '--']); } - const onOpenElectronUrl = mapEvent( - fromNodeEventEmitter(app, 'open-url', (event: Electron.Event, url: string) => ({ event, url })), + const onOpenElectronUrl = Event.map( + Event.fromNodeEventEmitter(app, 'open-url', (event: Electron.Event, url: string) => ({ event, url })), ({ event, url }) => { // always prevent default and return the url as string event.preventDefault(); return url; }); - const onOpenUrl = filterEvent(mapEvent(onOpenElectronUrl, uriFromRawUrl), uri => !!uri); + const onOpenUrl = Event.filter(Event.map(onOpenElectronUrl, uriFromRawUrl), uri => !!uri); onOpenUrl(this.urlService.open, this.urlService, this.disposables); const isWindowReady = windowsService.getWindows() @@ -65,7 +65,7 @@ export class ElectronURLListener { if (isWindowReady) { flush(); } else { - once(windowsService.onWindowReady)(flush); + Event.once(windowsService.onWindowReady)(flush); } } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index c73789dc60f..f55a9317248 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -5,7 +5,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { Event, latch, anyEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { IProcessEnvironment, isMacintosh, isWindows } from 'vs/base/common/platform'; import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -417,7 +417,7 @@ export class ActiveWindowManager implements IDisposable { private _activeWindowId: number | undefined; constructor(@IWindowsService windowsService: IWindowsService) { - const onActiveWindowChange = latch(anyEvent(windowsService.onWindowOpen, windowsService.onWindowFocus)); + const onActiveWindowChange = Event.latch(Event.any(windowsService.onWindowOpen, windowsService.onWindowFocus)); onActiveWindowChange(this.setActiveWindow, this, this.disposables); this.firstActiveWindowIdPromise = windowsService.getActiveWindowId() diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index da13e20afe7..c3443eea2b4 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, filterEvent, mapEvent, anyEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, IDevToolsOptions } from 'vs/platform/windows/common/windows'; import { IRecentlyOpened } from 'vs/platform/history/common/history'; @@ -30,12 +30,12 @@ export class WindowService extends Disposable implements IWindowService { ) { super(); - const onThisWindowFocus = mapEvent(filterEvent(windowsService.onWindowFocus, id => id === windowId), _ => true); - const onThisWindowBlur = mapEvent(filterEvent(windowsService.onWindowBlur, id => id === windowId), _ => false); - const onThisWindowMaximize = mapEvent(filterEvent(windowsService.onWindowMaximize, id => id === windowId), _ => true); - const onThisWindowUnmaximize = mapEvent(filterEvent(windowsService.onWindowUnmaximize, id => id === windowId), _ => false); - this.onDidChangeFocus = anyEvent(onThisWindowFocus, onThisWindowBlur); - this.onDidChangeMaximize = anyEvent(onThisWindowMaximize, onThisWindowUnmaximize); + const onThisWindowFocus = Event.map(Event.filter(windowsService.onWindowFocus, id => id === windowId), _ => true); + const onThisWindowBlur = Event.map(Event.filter(windowsService.onWindowBlur, id => id === windowId), _ => false); + const onThisWindowMaximize = Event.map(Event.filter(windowsService.onWindowMaximize, id => id === windowId), _ => true); + const onThisWindowUnmaximize = Event.map(Event.filter(windowsService.onWindowUnmaximize, id => id === windowId), _ => false); + this.onDidChangeFocus = Event.any(onThisWindowFocus, onThisWindowBlur); + this.onDidChangeMaximize = Event.any(onThisWindowMaximize, onThisWindowUnmaximize); this._hasFocus = document.hasFocus(); this.isFocused().then(focused => this._hasFocus = focused); diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index f6e909e1416..673fd375f50 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -13,7 +13,7 @@ import product from 'vs/platform/node/product'; import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IDevToolsOptions, INewWindowOptions } from 'vs/platform/windows/common/windows'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { shell, crashReporter, app, Menu, clipboard } from 'electron'; -import { Event, fromNodeEventEmitter, mapEvent, filterEvent, anyEvent, latch } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; import { IWindowsMainService, ISharedProcess } from 'vs/platform/windows/electron-main/windows'; @@ -33,13 +33,13 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable private _activeWindowId: number | undefined; - readonly onWindowOpen: Event = filterEvent(fromNodeEventEmitter(app, 'browser-window-created', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); - readonly onWindowBlur: Event = filterEvent(fromNodeEventEmitter(app, 'browser-window-blur', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); - readonly onWindowMaximize: Event = filterEvent(fromNodeEventEmitter(app, 'browser-window-maximize', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); - readonly onWindowUnmaximize: Event = filterEvent(fromNodeEventEmitter(app, 'browser-window-unmaximize', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); - readonly onWindowFocus: Event = anyEvent( - mapEvent(filterEvent(mapEvent(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), w => !!w), w => w.id), - filterEvent(fromNodeEventEmitter(app, 'browser-window-focus', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)) + readonly onWindowOpen: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); + readonly onWindowBlur: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); + readonly onWindowMaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); + readonly onWindowUnmaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); + readonly onWindowFocus: Event = Event.any( + Event.map(Event.filter(Event.map(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), w => !!w), w => w.id), + Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)) ); readonly onRecentlyOpenedChange: Event = this.historyService.onRecentlyOpenedChange; @@ -56,7 +56,7 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable urlService.registerHandler(this); // remember last active window id - latch(anyEvent(this.onWindowOpen, this.onWindowFocus)) + Event.latch(Event.any(this.onWindowOpen, this.onWindowFocus)) (id => this._activeWindowId = id, null, this.disposables); } diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index 033a993802a..70f26fc1d8b 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { TPromise } from 'vs/base/common/winjs.base'; -import { Event, buffer } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IMessageBoxResult, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IDevToolsOptions, INewWindowOptions } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; @@ -23,12 +23,12 @@ export class WindowsChannel implements IServerChannel { private onRecentlyOpenedChange: Event; constructor(private service: IWindowsService) { - this.onWindowOpen = buffer(service.onWindowOpen, true); - this.onWindowFocus = buffer(service.onWindowFocus, true); - this.onWindowBlur = buffer(service.onWindowBlur, true); - this.onWindowMaximize = buffer(service.onWindowMaximize, true); - this.onWindowUnmaximize = buffer(service.onWindowUnmaximize, true); - this.onRecentlyOpenedChange = buffer(service.onRecentlyOpenedChange, true); + this.onWindowOpen = Event.buffer(service.onWindowOpen, true); + this.onWindowFocus = Event.buffer(service.onWindowFocus, true); + this.onWindowBlur = Event.buffer(service.onWindowBlur, true); + this.onWindowMaximize = Event.buffer(service.onWindowMaximize, true); + this.onWindowUnmaximize = Event.buffer(service.onWindowUnmaximize, true); + this.onRecentlyOpenedChange = Event.buffer(service.onRecentlyOpenedChange, true); } listen(_, event: string): Event { diff --git a/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts b/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts index 1d9f281e977..9defb392d53 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts @@ -11,7 +11,7 @@ import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostC import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { dispose } from 'vs/base/common/lifecycle'; @@ -89,7 +89,7 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { // if promise has not been resolved yet, now is the time to ensure a return value // otherwise if already resolved it means the user clicked one of the buttons - once(messageHandle.onDidClose)(() => { + Event.once(messageHandle.onDidClose)(() => { dispose(...primaryActions, ...secondaryActions); resolve(undefined); }); diff --git a/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts b/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts index 256f62fb16d..e7f0708c8b1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts @@ -11,7 +11,7 @@ import { MainThreadOutputServiceShape, MainContext, IExtHostContext, ExtHostOutp import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; -import { anyEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; @extHostNamedCustomer(MainContext.MainThreadOutputService) export class MainThreadOutputService extends Disposable implements MainThreadOutputServiceShape { @@ -41,7 +41,7 @@ export class MainThreadOutputService extends Disposable implements MainThreadOut const visibleChannel: IOutputChannel = panel && panel.getId() === OUTPUT_PANEL_ID ? this._outputService.getActiveChannel() : null; this._proxy.$setVisibleChannel(visibleChannel ? visibleChannel.id : null); }; - this._register(anyEvent(this._outputService.onActiveOutputChannel, this._panelService.onDidPanelOpen, this._panelService.onDidPanelClose)(() => setVisibleChannel())); + this._register(Event.any(this._outputService.onActiveOutputChannel, this._panelService.onDidPanelOpen, this._panelService.onDidPanelClose)(() => setVisibleChannel())); setVisibleChannel(); } diff --git a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts index a0cbfcbc0fb..661d290e43f 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI, UriComponents } from 'vs/base/common/uri'; -import { Event, Emitter, debounceEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation } from 'vs/workbench/services/scm/common/scm'; @@ -276,7 +276,7 @@ export class MainThreadSCM implements MainThreadSCMShape { ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSCM); - debounceEvent(scmService.onDidChangeSelectedRepositories, (_, e) => e, 100) + Event.debounce(scmService.onDidChangeSelectedRepositories, (_, e) => e, 100) (this.onDidChangeSelectedRepositories, this, this._disposables); } diff --git a/src/vs/workbench/api/electron-browser/mainThreadWindow.ts b/src/vs/workbench/api/electron-browser/mainThreadWindow.ts index 62cb2f29bc0..7f914802597 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWindow.ts @@ -7,7 +7,7 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { MainThreadWindowShape, ExtHostWindowShape, ExtHostContext, MainContext, IExtHostContext } from '../node/extHost.protocol'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { latch } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; @extHostNamedCustomer(MainContext.MainThreadWindow) export class MainThreadWindow implements MainThreadWindowShape { @@ -21,7 +21,7 @@ export class MainThreadWindow implements MainThreadWindowShape { ) { this.proxy = extHostContext.getProxy(ExtHostContext.ExtHostWindow); - latch(windowService.onDidChangeFocus) + Event.latch(windowService.onDidChangeFocus) (this.proxy.$onDidChangeWindowFocus, this.proxy, this.disposables); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 353a2dedce7..5b15795f387 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; -import { Emitter, mapEvent } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { TernarySearchTree } from 'vs/base/common/map'; import * as paths from 'vs/base/common/paths'; import * as platform from 'vs/base/common/platform'; @@ -250,7 +250,7 @@ export function createApiFactory( }, get onDidChangeLogLevel() { checkProposedApiEnabled(extension); - return mapEvent(extHostLogService.onDidChangeLogLevel, l => typeConverters.LogLevel.to(l)); + return Event.map(extHostLogService.onDidChangeLogLevel, l => typeConverters.LogLevel.to(l)); }, get clipboard(): vscode.Clipboard { return extHostClipboard; diff --git a/src/vs/workbench/api/node/extHostDiagnostics.ts b/src/vs/workbench/api/node/extHostDiagnostics.ts index 2a9709191a6..3fdf6edf07e 100644 --- a/src/vs/workbench/api/node/extHostDiagnostics.ts +++ b/src/vs/workbench/api/node/extHostDiagnostics.ts @@ -11,7 +11,7 @@ import { MainContext, MainThreadDiagnosticsShape, ExtHostDiagnosticsShape, IMain import { DiagnosticSeverity, Diagnostic } from './extHostTypes'; import * as converter from './extHostTypeConverters'; import { mergeSort, equals } from 'vs/base/common/arrays'; -import { Event, Emitter, debounceEvent, mapEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { keys } from 'vs/base/common/map'; export class DiagnosticCollection implements vscode.DiagnosticCollection { @@ -249,7 +249,7 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { return { uris }; } - readonly onDidChangeDiagnostics: Event = mapEvent(debounceEvent(this._onDidChangeDiagnostics.event, ExtHostDiagnostics._debouncer, 50), ExtHostDiagnostics._mapper); + readonly onDidChangeDiagnostics: Event = Event.map(Event.debounce(this._onDidChangeDiagnostics.event, ExtHostDiagnostics._debouncer, 50), ExtHostDiagnostics._mapper); constructor(mainContext: IMainContext) { this._proxy = mainContext.getProxy(MainContext.MainThreadDiagnostics); diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index 169dbf9650a..1ed3ad6bba9 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI, UriComponents } from 'vs/base/common/uri'; -import { Event, Emitter, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { debounce } from 'vs/base/common/decorators'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { asThenable } from 'vs/base/common/async'; @@ -478,7 +478,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this.eventuallyUpdateResourceStates(); }); - once(group.onDidDispose)(() => { + Event.once(group.onDidDispose)(() => { this.updatedResourceGroups.delete(group); updateListener.dispose(); this._groups.delete(group.handle); diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index 60f9eef2a41..8d71acffbcf 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import * as vscode from 'vscode'; import { basename } from 'vs/base/common/paths'; import { URI } from 'vs/base/common/uri'; -import { debounceEvent, Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { ExtHostTreeViewsShape, MainThreadTreeViewsShape } from './extHost.protocol'; import { ITreeItem, TreeViewItemHandleArg, ITreeItemLabel, IRevealOptions } from 'vs/workbench/common/views'; @@ -179,7 +179,7 @@ class ExtHostTreeView extends Disposable { this.proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll }); if (this.dataProvider.onDidChangeTreeData) { let refreshingPromise, promiseCallback; - this._register(debounceEvent(this.dataProvider.onDidChangeTreeData, (last, current) => { + this._register(Event.debounce(this.dataProvider.onDidChangeTreeData, (last, current) => { if (!refreshingPromise) { // New refresh has started refreshingPromise = new Promise(c => promiseCallback = c); diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index 1f18faf3b33..2bd03e27045 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -12,7 +12,7 @@ import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/group/ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { LRUCache } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; -import { once, Event } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { isEmptyObject } from 'vs/base/common/types'; import { DEFAULT_EDITOR_MIN_DIMENSIONS, DEFAULT_EDITOR_MAX_DIMENSIONS } from 'vs/workbench/browser/parts/editor/editor'; @@ -205,7 +205,7 @@ export class EditorMemento implements IEditorMemento { // Automatically clear when editor input gets disposed if any if (resourceOrEditor instanceof EditorInput) { - once(resourceOrEditor.onDispose)(() => { + Event.once(resourceOrEditor.onDispose)(() => { this.clearEditorState(resource); }); } diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts index 64fefc6b837..b77070a5a55 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts @@ -8,7 +8,7 @@ import { TimeoutTimer } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { size } from 'vs/base/common/collections'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { debounceEvent, Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { isEqual, dirname } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; @@ -131,7 +131,7 @@ export class EditorBreadcrumbsModel { this._disposables.push(DocumentSymbolProviderRegistry.onDidChange(_ => this._updateOutline())); this._disposables.push(this._editor.onDidChangeModel(_ => this._updateOutline())); this._disposables.push(this._editor.onDidChangeModelLanguage(_ => this._updateOutline())); - this._disposables.push(debounceEvent(this._editor.onDidChangeModelContent, _ => _, 350)(_ => this._updateOutline(true))); + this._disposables.push(Event.debounce(this._editor.onDidChangeModelContent, _ => _, 350)(_ => this._updateOutline(true))); this._updateOutline(); // stop when editor dies diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 0c627ec8911..5052acfdc7e 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/editorgroupview'; import { TPromise } from 'vs/base/common/winjs.base'; import { EditorGroup, IEditorOpenOptions, EditorCloseEvent, ISerializedEditorGroup, isSerializedEditorGroup } from 'vs/workbench/common/editor/editorGroup'; import { EditorInput, EditorOptions, GroupIdentifier, ConfirmResult, SideBySideEditorInput, CloseDirection, IEditorCloseEvent, EditorGroupActiveEditorDirtyContext } from 'vs/workbench/common/editor'; -import { Event, Emitter, once, Relay } from 'vs/base/common/event'; +import { Event, Emitter, Relay } from 'vs/base/common/event'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { addClass, addClasses, Dimension, trackFocus, toggleClass, removeClass, addDisposableListener, EventType, EventHelper, findParentWithClass, clearNode, isAncestor } from 'vs/base/browser/dom'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -827,7 +827,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { actions }); - once(handle.onDidClose)(() => dispose(actions.primary)); + Event.once(handle.onDidClose)(() => dispose(actions.primary)); } // Event diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index 7d9bb7b7280..051a40d3b8f 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -7,7 +7,7 @@ import 'vs/workbench/browser/parts/editor/editor.contribution'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Part } from 'vs/workbench/browser/part'; import { Dimension, isAncestor, toggleClass, addClass, $ } from 'vs/base/browser/dom'; -import { Event, Emitter, once, Relay, anyEvent } from 'vs/base/common/event'; +import { Event, Emitter, Relay } from 'vs/base/common/event'; import { contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, ICopyEditorOptions, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument } from 'vs/workbench/services/group/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -105,7 +105,7 @@ export class EditorPart extends Part implements EditorGroupsServiceImpl, IEditor private onDidSetGridWidget = this._register(new Emitter<{ width: number; height: number; }>()); private _onDidSizeConstraintsChange = this._register(new Relay<{ width: number; height: number; }>()); - get onDidSizeConstraintsChange(): Event<{ width: number; height: number; }> { return anyEvent(this.onDidSetGridWidget.event, this._onDidSizeConstraintsChange.event); } + get onDidSizeConstraintsChange(): Event<{ width: number; height: number; }> { return Event.any(this.onDidSetGridWidget.event, this._onDidSizeConstraintsChange.event); } private _onDidPreferredSizeChange: Emitter = this._register(new Emitter()); get onDidPreferredSizeChange(): Event { return this._onDidPreferredSizeChange.event; } @@ -523,7 +523,7 @@ export class EditorPart extends Part implements EditorGroupsServiceImpl, IEditor })); // Track dispose - once(groupView.onWillDispose)(() => { + Event.once(groupView.onWillDispose)(() => { groupDisposables = dispose(groupDisposables); this.groupViews.delete(groupView.id); this.doUpdateMostRecentActive(groupView); diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 258cef6a89c..b6bb0cffc16 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -50,7 +50,7 @@ import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { timeout } from 'vs/base/common/async'; import { INotificationHandle, INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; class SideBySideEditorEncodingSupport implements IEncodingSupport { constructor(private master: IEncodingSupport, private details: IEncodingSupport) { } @@ -514,7 +514,7 @@ export class EditorStatus implements IStatusbarItem { { sticky: true } ); - once(this.screenReaderNotification.onDidClose)(() => { + Event.once(this.screenReaderNotification.onDidClose)(() => { this.screenReaderNotification = null; }); } diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts index 24ad6f28dce..ffe94a1943f 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts @@ -15,7 +15,7 @@ import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/br import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; import { SplitView, Sizing, Orientation } from 'vs/base/browser/ui/splitview/splitview'; -import { Event, Relay, anyEvent, mapEvent, Emitter } from 'vs/base/common/event'; +import { Event, Relay, Emitter } from 'vs/base/common/event'; import { IStorageService } from 'vs/platform/storage/common/storage'; export class SideBySideEditor extends BaseEditor { @@ -54,7 +54,7 @@ export class SideBySideEditor extends BaseEditor { private onDidCreateEditors = this._register(new Emitter<{ width: number; height: number; }>()); private _onDidSizeConstraintsChange = this._register(new Relay<{ width: number; height: number; }>()); - readonly onDidSizeConstraintsChange: Event<{ width: number; height: number; }> = anyEvent(this.onDidCreateEditors.event, this._onDidSizeConstraintsChange.event); + readonly onDidSizeConstraintsChange: Event<{ width: number; height: number; }> = Event.any(this.onDidCreateEditors.event, this._onDidSizeConstraintsChange.event); constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -193,9 +193,9 @@ export class SideBySideEditor extends BaseEditor { this.detailsEditor = details; this.masterEditor = master; - this._onDidSizeConstraintsChange.input = anyEvent( - mapEvent(details.onDidSizeConstraintsChange, () => undefined), - mapEvent(master.onDidSizeConstraintsChange, () => undefined) + this._onDidSizeConstraintsChange.input = Event.any( + Event.map(details.onDidSizeConstraintsChange, () => undefined), + Event.map(master.onDidSizeConstraintsChange, () => undefined) ); this.onDidCreateEditors.fire(); diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 93408aefe10..44cfef0bb1e 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -26,7 +26,7 @@ import { ScrollType, IDiffEditorViewState, IDiffEditorModel } from 'vs/editor/co import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { URI } from 'vs/base/common/uri'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -282,7 +282,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditor { super.saveTextEditorViewState(resource); // Make sure to clean up when the input gets disposed - once(input.onDispose)(() => { + Event.once(input.onDispose)(() => { super.clearTextEditorViewState([resource]); }); } diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index c3165bd0822..a90138fb843 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -18,7 +18,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -190,7 +190,7 @@ export class AbstractTextResourceEditor extends BaseTextEditor { super.saveTextEditorViewState(resource); // Make sure to clean up when the input gets disposed - once(input.onDispose)(() => { + Event.once(input.onDispose)(() => { super.clearTextEditorViewState([resource]); }); } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsAlerts.ts b/src/vs/workbench/browser/parts/notifications/notificationsAlerts.ts index cce3257d614..94a5a660b43 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsAlerts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsAlerts.ts @@ -9,7 +9,7 @@ import { INotificationViewItem, INotificationsModel, NotificationChangeType, INo import { Disposable } from 'vs/base/common/lifecycle'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { Severity } from 'vs/platform/notification/common/notification'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export class NotificationsAlerts extends Disposable { @@ -52,7 +52,7 @@ export class NotificationsAlerts extends Disposable { } }); - once(notifiation.onDidClose)(() => listener.dispose()); + Event.once(notifiation.onDidClose)(() => listener.dispose()); this.doTriggerAriaAlert(notifiation); } diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 8ba5361b3b5..7cab630f56b 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -9,7 +9,7 @@ import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { addClass, removeClass, isAncestor, addDisposableListener, EventType, Dimension } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { NotificationsList } from 'vs/workbench/browser/parts/notifications/notificationsList'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { Themable, NOTIFICATIONS_TOAST_BORDER } from 'vs/workbench/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -194,7 +194,7 @@ export class NotificationsToasts extends Themable { })); // Remove when item gets closed - once(item.onDidClose)(() => { + Event.once(item.onDidClose)(() => { this.removeToast(item); }); diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 318b573471d..9a9cf4abbb6 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/panelpart'; import { IAction } from 'vs/base/common/actions'; -import { Event, mapEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { Registry } from 'vs/platform/registry/common/platform'; import { ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { IPanel } from 'vs/workbench/common/panel'; @@ -170,7 +170,7 @@ export class PanelPart extends CompositePart implements IPanelService { } get onDidPanelOpen(): Event<{ panel: IPanel, focus: boolean }> { - return mapEvent(this._onDidCompositeOpen.event, compositeOpen => ({ panel: compositeOpen.composite, focus: compositeOpen.focus })); + return Event.map(this._onDidCompositeOpen.event, compositeOpen => ({ panel: compositeOpen.composite, focus: compositeOpen.focus })); } get onDidPanelClose(): Event { diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 078f43258e3..3b811701b85 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -25,7 +25,7 @@ import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { attachBadgeStyler, attachProgressBarStyler, attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; -import { debounceEvent, Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { Button } from 'vs/base/browser/ui/button/button'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; @@ -1144,7 +1144,7 @@ export class QuickInputService extends Component implements IQuickInputService { } const input = this.createInputBox(); const validateInput = options.validateInput || (() => >Promise.resolve(undefined)); - const onDidValueChange = debounceEvent(input.onDidChangeValue, (last, cur) => cur, 100); + const onDidValueChange = Event.debounce(input.onDidChangeValue, (last, cur) => cur, 100); let validationValue = options.value || ''; let validation = Promise.resolve(validateInput(validationValue)); const disposables = [ diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts index 558a89487ed..ce7ed6a9940 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts @@ -13,7 +13,7 @@ import { IQuickPickItem, IQuickPickItemButtonEvent, IQuickPickSeparator } from ' import { IMatch } from 'vs/base/common/filters'; import { matchesFuzzyOcticonAware, parseOcticons } from 'vs/base/common/octicon'; import { compareAnything } from 'vs/base/common/comparers'; -import { Emitter, Event, mapEvent } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; @@ -294,12 +294,12 @@ export class QuickInputList { @memoize get onDidChangeFocus() { - return mapEvent(this.list.onFocusChange, e => e.elements.map(e => e.item)); + return Event.map(this.list.onFocusChange, e => e.elements.map(e => e.item)); } @memoize get onDidChangeSelection() { - return mapEvent(this.list.onSelectionChange, e => e.elements.map(e => e.item)); + return Event.map(this.list.onSelectionChange, e => e.elements.map(e => e.item)); } getAllVisibleChecked() { diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 049e83884a2..239258f3a5e 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -20,7 +20,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { Event, mapEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND, SIDE_BAR_BORDER } from 'vs/workbench/common/theme'; @@ -75,7 +75,7 @@ export class SidebarPart extends CompositePart { } get onDidViewletOpen(): Event { - return mapEvent(this._onDidCompositeOpen.event, compositeEvent => compositeEvent.composite); + return Event.map(this._onDidCompositeOpen.event, compositeEvent => compositeEvent.composite); } get onDidViewletClose(): Event { diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 14ad41e217b..068e36fbb85 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/panelviewlet'; import * as nls from 'vs/nls'; -import { Event, Emitter, filterEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { attachStyler, IColorMapping } from 'vs/platform/theme/common/styler'; import { SIDE_BAR_DRAG_AND_DROP_BACKGROUND, SIDE_BAR_SECTION_HEADER_FOREGROUND, SIDE_BAR_SECTION_HEADER_BACKGROUND, SIDE_BAR_SECTION_HEADER_BORDER } from 'vs/workbench/common/theme'; @@ -112,7 +112,7 @@ export abstract class ViewletPanel extends Panel implements IView { this.disposables.push(this.toolbar); this.setActions(); - const onDidRelevantConfigurationChange = filterEvent(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration(ViewletPanel.AlwaysShowActionsConfig)); + const onDidRelevantConfigurationChange = Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration(ViewletPanel.AlwaysShowActionsConfig)); onDidRelevantConfigurationChange(this.updateActionsVisibility, this, this.disposables); this.updateActionsVisibility(); } diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 59160a4a9f6..acadcbb0185 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -10,7 +10,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IContextKeyService, IContextKeyChangeEvent, IReadableSet, IContextKey, RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { Event, chain, filterEvent, Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { sortedDiff, firstIndex, move } from 'vs/base/common/arrays'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isUndefinedOrNull } from 'vs/base/common/types'; @@ -21,7 +21,7 @@ import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/co import { values } from 'vs/base/common/map'; function filterViewEvent(container: ViewContainer, event: Event): Event { - return chain(event) + return Event.chain(event) .map(views => views.filter(view => view.container === container)) .filter(views => views.length > 0) .event; @@ -93,7 +93,7 @@ class ViewDescriptorCollection extends Disposable implements IViewDescriptorColl const onRelevantViewsDeregistered = filterViewEvent(container, ViewsRegistry.onViewsDeregistered); this._register(onRelevantViewsDeregistered(this.onViewsDeregistered, this)); - const onRelevantContextChange = filterEvent(contextKeyService.onDidChangeContext, e => e.affectsSome(this.contextKeys)); + const onRelevantContextChange = Event.filter(contextKeyService.onDidChangeContext, e => e.affectsSome(this.contextKeys)); this._register(onRelevantContextChange(this.onContextChanged, this)); this.onViewsRegistered(ViewsRegistry.getViews(container)); diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index ccb063ff707..cd256a1288f 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -23,7 +23,7 @@ import { DefaultPanelDndController } from 'vs/base/browser/ui/splitview/panelvie import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; import { IWorkbenchThemeService, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { ITreeConfiguration, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; -import { latch, mapEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { localize } from 'vs/nls'; @@ -274,7 +274,7 @@ export abstract class ViewContainerViewlet extends PanelViewlet implements IView this.onContextMenu(new StandardMouseEvent(e), viewDescriptor); }); - const collapseDisposable = latch(mapEvent(panel.onDidChange, () => !panel.isExpanded()))(collapsed => { + const collapseDisposable = Event.latch(Event.map(panel.onDidChange, () => !panel.isExpanded()))(collapsed => { this.viewsModel.setCollapsed(viewDescriptor.id, collapsed); }); diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index b4d176cfe59..58687f33002 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { TPromise } from 'vs/base/common/winjs.base'; -import { Event, Emitter, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import * as objects from 'vs/base/common/objects'; import * as types from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; @@ -567,14 +567,14 @@ export class SideBySideEditorInput extends EditorInput { private registerListeners(): void { // When the details or master input gets disposed, dispose this diff editor input - const onceDetailsDisposed = once(this.details.onDispose); + const onceDetailsDisposed = Event.once(this.details.onDispose); this._register(onceDetailsDisposed(() => { if (!this.isDisposed()) { this.dispose(); } })); - const onceMasterDisposed = once(this.master.onDispose); + const onceMasterDisposed = Event.once(this.master.onDispose); this._register(onceMasterDisposed(() => { if (!this.isDisposed()) { this.dispose(); diff --git a/src/vs/workbench/common/editor/editorGroup.ts b/src/vs/workbench/common/editor/editorGroup.ts index 1be2b0b0c5c..ae5d6efed7e 100644 --- a/src/vs/workbench/common/editor/editorGroup.ts +++ b/src/vs/workbench/common/editor/editorGroup.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Emitter, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { Extensions, IEditorInputFactoryRegistry, EditorInput, toResource, IEditorIdentifier, IEditorCloseEvent, GroupIdentifier, SideBySideEditorInput, CloseDirection } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -272,7 +272,7 @@ export class EditorGroup extends Disposable { const unbind: IDisposable[] = []; // Re-emit disposal of editor input as our own event - const onceDispose = once(editor.onDispose); + const onceDispose = Event.once(editor.onDispose); unbind.push(onceDispose(() => { if (this.indexOf(editor) >= 0) { this._onDidEditorDispose.fire(editor); diff --git a/src/vs/workbench/common/notifications.ts b/src/vs/workbench/common/notifications.ts index da4de853b3b..adc2d78f1dc 100644 --- a/src/vs/workbench/common/notifications.ts +++ b/src/vs/workbench/common/notifications.ts @@ -5,7 +5,7 @@ import { INotification, INotificationHandle, INotificationActions, INotificationProgress, NoOpNotification, Severity, NotificationMessage, IPromptChoice } from 'vs/platform/notification/common/notification'; import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { Event, Emitter, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { Action } from 'vs/base/common/actions'; @@ -53,7 +53,7 @@ export class NotificationHandle implements INotificationHandle { } private registerListeners(): void { - once(this.item.onDidClose)(() => { + Event.once(this.item.onDidClose)(() => { this._onDidClose.fire(); this._onDidClose.dispose(); }); @@ -160,7 +160,7 @@ export class NotificationsModel extends Disposable implements INotificationsMode } }); - once(item.onDidClose)(() => { + Event.once(item.onDidClose)(() => { itemExpansionChangeListener.dispose(); itemLabelChangeListener.dispose(); diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 1a66d73400d..955976330f3 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -28,7 +28,7 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderW import { FileKind } from 'vs/platform/files/common/files'; import { IssueType } from 'vs/platform/issue/common/issue'; import { domEvent } from 'vs/base/browser/event'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import { getDomNodePagePosition, createStyleSheet, createCSSRule } from 'vs/base/browser/dom'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -1285,10 +1285,10 @@ export class InspectContextKeysAction extends Action { hoverFeedback.style.height = `${position.height}px`; })); - const onMouseDown = once(domEvent(document.body, 'mousedown', true)); + const onMouseDown = Event.once(domEvent(document.body, 'mousedown', true)); onMouseDown(e => { e.preventDefault(); e.stopPropagation(); }, null, disposables); - const onMouseUp = once(domEvent(document.body, 'mouseup', true)); + const onMouseUp = Event.once(domEvent(document.body, 'mouseup', true)); onMouseUp(e => { e.preventDefault(); e.stopPropagation(); diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 35bc4a82b31..22f045c6ec6 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/workbench'; import { localize } from 'vs/nls'; import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import * as DOM from 'vs/base/browser/dom'; import { RunOnceScheduler, runWhenIdle } from 'vs/base/common/async'; import * as browser from 'vs/base/browser/browser'; @@ -665,7 +665,7 @@ export class Workbench extends Disposable implements IPartService { if (isInputFocused) { const tracker = DOM.trackFocus(document.activeElement as HTMLElement); - once(tracker.onDidBlur)(() => { + Event.once(tracker.onDidBlur)(() => { inputFocused.set(activeElementIsInput()); tracker.dispose(); diff --git a/src/vs/workbench/node/extensionHostProcess.ts b/src/vs/workbench/node/extensionHostProcess.ts index 8d182d18d9e..ea1b550b065 100644 --- a/src/vs/workbench/node/extensionHostProcess.ts +++ b/src/vs/workbench/node/extensionHostProcess.ts @@ -6,7 +6,7 @@ import * as nativeWatchdog from 'native-watchdog'; import { createConnection } from 'net'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { Event, filterEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; import { Protocol } from 'vs/base/parts/ipc/node/ipc.net'; import product from 'vs/platform/node/product'; @@ -61,7 +61,7 @@ function createExtHostProtocol(): Promise { private _terminating = false; - readonly onMessage: Event = filterEvent(protocol.onMessage, msg => { + readonly onMessage: Event = Event.filter(protocol.onMessage, msg => { if (!isMessageOfType(msg, MessageType.Terminate)) { return true; } diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts b/src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts index 1a381b2e3d9..5eb4f96c265 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/suggestEnabledInput'; import { $, Dimension, addClass, append, removeClass } from 'vs/base/browser/dom'; import { Widget } from 'vs/base/browser/ui/widget'; import { Color } from 'vs/base/common/color'; -import { Emitter, Event, chain } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { mixin } from 'vs/base/common/objects'; @@ -147,7 +147,7 @@ export class SuggestEnabledInput extends Widget implements IThemable { removeClass(this.stylingContainer, 'synthetic-focus'); }))); - const onKeyDownMonaco = chain(this.inputWidget.onKeyDown); + const onKeyDownMonaco = Event.chain(this.inputWidget.onKeyDown); onKeyDownMonaco.filter(e => e.keyCode === KeyCode.Enter).on(e => { e.preventDefault(); this._onEnter.fire(); }, this, this.disposables); onKeyDownMonaco.filter(e => e.keyCode === KeyCode.DownArrow && (isMacintosh ? e.metaKey : e.ctrlKey)).on(() => this._onShouldFocusResults.fire(), this, this.disposables); diff --git a/src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts b/src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts index 213a134d437..c05ebbdbb23 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts +++ b/src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/panel'; import * as dom from 'vs/base/browser/dom'; import { IAction } from 'vs/base/common/actions'; -import { debounceEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { CollapseAllAction, DefaultAccessibilityProvider, DefaultController, DefaultDragAndDrop } from 'vs/base/parts/tree/browser/treeDefaults'; import { isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -142,7 +142,7 @@ export class CommentsPanel extends Panel { }); const commentsNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true })); - this._register(debounceEvent(commentsNavigator.openResource, (last, event) => event, 100, true)(options => { + this._register(Event.debounce(commentsNavigator.openResource, (last, event) => event, 100, true)(options => { this.openFile(options.element, options.editorOptions.pinned, options.editorOptions.preserveFocus, options.sideBySide); })); } diff --git a/src/vs/workbench/parts/extensions/browser/extensionsViewer.ts b/src/vs/workbench/parts/extensions/browser/extensionsViewer.ts index 98e737c1c7a..9dc6705e5be 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsViewer.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsViewer.ts @@ -10,7 +10,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDataSource, ITree, IRenderer } from 'vs/base/parts/tree/browser/tree'; import { Action } from 'vs/base/common/actions'; import { IExtensionsWorkbenchService, IExtension } from 'vs/workbench/parts/extensions/common/extensions'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; @@ -132,7 +132,7 @@ export class Renderer implements IRenderer { private renderExtension(tree: ITree, extensionData: IExtensionData, data: IExtensionTemplateData): void { const extension = extensionData.extension; - const onError = once(domEvent(data.icon, 'error')); + const onError = Event.once(domEvent(data.icon, 'error')); onError(() => data.icon.src = extension.iconUrlFallback, null, data.extensionDisposables); data.icon.src = extension.iconUrl; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 9a90faff989..738d116c2f1 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -9,7 +9,7 @@ import * as marked from 'vs/base/common/marked/marked'; import { createCancelablePromise } from 'vs/base/common/async'; import * as arrays from 'vs/base/common/arrays'; import { OS } from 'vs/base/common/platform'; -import { Event, Emitter, once, chain } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { Cache, CacheResult } from 'vs/base/common/cache'; import { Action } from 'vs/base/common/actions'; import { isPromiseCanceledError } from 'vs/base/common/errors'; @@ -254,12 +254,12 @@ export class ExtensionEditor extends BaseEditor { this.disposables.push(this.extensionActionBar); this.disposables.push(this.ignoreActionbar); - chain(this.extensionActionBar.onDidRun) + Event.chain(this.extensionActionBar.onDidRun) .map(({ error }) => error) .filter(error => !!error) .on(this.onError, this, this.disposables); - chain(this.ignoreActionbar.onDidRun) + Event.chain(this.ignoreActionbar.onDidRun) .map(({ error }) => error) .filter(error => !!error) .on(this.onError, this, this.disposables); @@ -284,7 +284,7 @@ export class ExtensionEditor extends BaseEditor { this.extensionManifest = new Cache(() => createCancelablePromise(token => extension.getManifest(token))); this.extensionDependencies = new Cache(() => createCancelablePromise(token => this.extensionsWorkbenchService.loadDependencies(extension, token))); - const onError = once(domEvent(this.icon, 'error')); + const onError = Event.once(domEvent(this.icon, 'error')); onError(() => this.icon.src = extension.iconUrlFallback, null, this.transientDisposables); this.icon.src = extension.iconUrl; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts index a6fd29737e0..eef65a957ac 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts @@ -11,7 +11,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; -import { once, Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IExtension, IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, extensionButtonProminentBackground, extensionButtonProminentForeground, MaliciousStatusLabelAction, ExtensionActionItem } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; @@ -166,7 +166,7 @@ export class Renderer implements IPagedRenderer { } }); - const onError = once(domEvent(data.icon, 'error')); + const onError = Event.once(domEvent(data.icon, 'error')); onError(() => data.icon.src = extension.iconUrlFallback, null, data.extensionDisposables); data.icon.src = extension.iconUrl; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts index 9ea9c72fb2a..24dfdc2e922 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts @@ -5,7 +5,7 @@ import * as arrays from 'vs/base/common/arrays'; import { localize } from 'vs/nls'; -import { Event, chain, anyEvent, debounceEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -100,11 +100,11 @@ export class KeymapExtensions implements IWorkbenchContribution { export function onExtensionChanged(accessor: ServicesAccessor): Event { const extensionService = accessor.get(IExtensionManagementService); const extensionEnablementService = accessor.get(IExtensionEnablementService); - const onDidInstallExtension = chain(extensionService.onDidInstallExtension) + const onDidInstallExtension = Event.chain(extensionService.onDidInstallExtension) .filter(e => e.operation === InstallOperation.Install) .event; - return debounceEvent(anyEvent( - chain(anyEvent(onDidInstallExtension, extensionService.onDidUninstallExtension)) + return Event.debounce(Event.any( + Event.chain(Event.any(onDidInstallExtension, extensionService.onDidUninstallExtension)) .map(e => ({ id: stripVersion(e.identifier.id), uuid: e.identifier.uuid })) .event, extensionEnablementService.onEnablementChanged diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts index cc95f045563..53cec573e78 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { dispose } from 'vs/base/common/lifecycle'; import { assign } from 'vs/base/common/objects'; -import { chain, Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { PagedModel, IPagedModel, IPager, DelayedPagedModel } from 'vs/base/common/paging'; import { SortBy, SortOrder, IQueryOptions, LocalExtensionType, IExtensionTipsService, IExtensionRecommendation } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -97,12 +97,12 @@ export class ExtensionsListView extends ViewletPanel { this.list.onFocusChange(e => this.onFocusChange(e), this, this.disposables); this.disposables.push(this.list); - chain(this.list.onOpen) + Event.chain(this.list.onOpen) .map(e => e.elements[0]) .filter(e => !!e) .on(this.openExtension, this, this.disposables); - chain(this.list.onPin) + Event.chain(this.list.onPin) .map(e => e.elements[0]) .filter(e => !!e) .on(this.pin, this, this.disposables); diff --git a/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts b/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts index c7da9ccf23e..48984cd6604 100644 --- a/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts +++ b/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts @@ -29,7 +29,7 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ExecuteCommandAction } from 'vs/platform/actions/common/actions'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { isWindows } from 'vs/base/common/platform'; @@ -172,7 +172,7 @@ export class SaveErrorHandler extends Disposable implements ISaveErrorHandler, I // Show message and keep function to hide in case the file gets saved/reverted const handle = this.notificationService.notify({ severity: Severity.Error, message, actions }); - once(handle.onDidClose)(() => dispose(...actions.primary, ...actions.secondary)); + Event.once(handle.onDidClose)(() => dispose(...actions.primary, ...actions.secondary)); this.messages.set(model.getResource(), handle); } @@ -258,7 +258,7 @@ class ResolveSaveConflictAction extends Action { actions.secondary.push(this.instantiationService.createInstance(DoNotShowResolveConflictLearnMoreAction)); const handle = this.notificationService.notify({ severity: Severity.Info, message: conflictEditorHelp, actions }); - once(handle.onDidClose)(() => dispose(...actions.primary, ...actions.secondary)); + Event.once(handle.onDidClose)(() => dispose(...actions.primary, ...actions.secondary)); pendingResolveSaveConflictMessages.push(handle); }); } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 6c950152f3d..429519bab62 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -26,7 +26,7 @@ import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Iterator } from 'vs/base/common/iterator'; import { ITreeElement, ITreeNode, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; -import { debounceEvent, Relay, Event, Emitter } from 'vs/base/common/event'; +import { Relay, Event, Emitter } from 'vs/base/common/event'; import { WorkbenchObjectTree, TreeResourceNavigator2 } from 'vs/platform/list/browser/listService'; import { FilterOptions } from 'vs/workbench/parts/markers/electron-browser/markersFilterOptions'; import { IExpression, getEmptyExpression } from 'vs/base/common/glob'; @@ -320,7 +320,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { })); const markersNavigator = this._register(new TreeResourceNavigator2(this.tree, { openOnFocus: true })); - this._register(debounceEvent(markersNavigator.openResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(markersNavigator.openResource, (last, event) => event, 75, true)(options => { this.openFileAtElement(options.element, options.editorOptions.preserveFocus, options.sideBySide, options.editorOptions.pinned); })); @@ -354,7 +354,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { } private createListeners(): void { - const onModelChange = debounceEvent(this.markersWorkbenchService.markersModel.onDidChange, (uris, uri) => { if (!uris) { uris = []; } uris.push(uri); return uris; }, 0); + const onModelChange = Event.debounce(this.markersWorkbenchService.markersModel.onDidChange, (uris, uri) => { if (!uris) { uris = []; } uris.push(uri); return uris; }, 0); this._register(onModelChange(this.onDidChangeModel, this)); this._register(this.editorService.onDidActiveEditorChange(this.onActiveEditorChanged, this)); diff --git a/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts b/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts index 6d6e7aab7bb..2fc292ebe31 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts @@ -20,7 +20,7 @@ import { IEditorOptions, RenderLineNumbersType } from 'vs/editor/common/config/e import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { CancellationToken } from 'vs/base/common/cancellation'; export const GOTO_LINE_PREFIX = ':'; @@ -60,7 +60,7 @@ export class GotoLineAction extends QuickOpenAction { const result = super.run(); if (restoreOptions) { - once(this._quickOpenService.onHide)(() => { + Event.once(this._quickOpenService.onHide)(() => { activeTextEditorWidget.updateOptions(restoreOptions); }); } diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index b0393bf5367..fb49fce43a2 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -8,7 +8,7 @@ import * as nls from 'vs/nls'; import 'vs/css!./media/dirtydiffDecorator'; import { ThrottledDelayer, always, first } from 'vs/base/common/async'; import { IDisposable, dispose, toDisposable, Disposable, combinedDisposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter, anyEvent as anyEvent, filterEvent, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import * as ext from 'vs/workbench/common/contributions'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -224,7 +224,7 @@ class DirtyDiffWidget extends PeekViewWidget { return; } - const onFirstDiffUpdate = once(this.diffEditor.onDidUpdateDiff); + const onFirstDiffUpdate = Event.once(this.diffEditor.onDidUpdateDiff); // TODO@joao TODO@alex need this setTimeout probably because the // non-side-by-side diff still hasn't created the view zones @@ -661,7 +661,7 @@ export class DirtyDiffController implements IEditorContribution { this.isDirtyDiffVisible.set(true); const disposables: IDisposable[] = []; - once(this.widget.onDidClose)(this.close, this, disposables); + Event.once(this.widget.onDidClose)(this.close, this, disposables); model.onDidChange(this.onDidModelChange, this, disposables); disposables.push( @@ -971,10 +971,10 @@ export class DirtyDiffModel { this.repositoryDisposables.add(disposables); disposables.push(toDisposable(() => this.repositoryDisposables.delete(disposables))); - const onDidChange = anyEvent(repository.provider.onDidChange, repository.provider.onDidChangeResources); + const onDidChange = Event.any(repository.provider.onDidChange, repository.provider.onDidChangeResources); onDidChange(this.triggerDiff, this, disposables); - const onDidRemoveThis = filterEvent(this.scmService.onDidRemoveRepository, r => r === repository); + const onDidRemoveThis = Event.filter(this.scmService.onDidRemoveRepository, r => r === repository); onDidRemoveThis(() => dispose(disposables), null, disposables); this.triggerDiff(); @@ -1150,11 +1150,11 @@ export class DirtyDiffWorkbenchController implements ext.IWorkbenchContribution, this.stylesheet = createStyleSheet(); this.disposables.push(toDisposable(() => this.stylesheet.parentElement.removeChild(this.stylesheet))); - const onDidChangeConfiguration = filterEvent(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.diffDecorations')); + const onDidChangeConfiguration = Event.filter(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.diffDecorations')); onDidChangeConfiguration(this.onDidChangeConfiguration, this, this.disposables); this.onDidChangeConfiguration(); - const onDidChangeDiffWidthConfiguration = filterEvent(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.diffDecorationsGutterWidth')); + const onDidChangeDiffWidthConfiguration = Event.filter(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.diffDecorationsGutterWidth')); onDidChangeDiffWidthConfiguration(this.onDidChangeDiffWidthConfiguration, this); this.onDidChangeDiffWidthConfiguration(); } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts b/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts index 28cbac4159c..a5f33f48532 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/paths'; import { IDisposable, dispose, Disposable, combinedDisposable } from 'vs/base/common/lifecycle'; -import { filterEvent, anyEvent as anyEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; @@ -37,10 +37,10 @@ export class StatusUpdater implements IWorkbenchContribution { private onDidAddRepository(repository: ISCMRepository): void { const provider = repository.provider; - const onDidChange = anyEvent(provider.onDidChange, provider.onDidChangeResources); + const onDidChange = Event.any(provider.onDidChange, provider.onDidChangeResources); const changeDisposable = onDidChange(() => this.render()); - const onDidRemove = filterEvent(this.scmService.onDidRemoveRepository, e => e === repository); + const onDidRemove = Event.filter(this.scmService.onDidRemoveRepository, e => e === repository); const removeDisposable = onDidRemove(() => { disposable.dispose(); this.disposables = this.disposables.filter(d => d !== removeDisposable); @@ -140,7 +140,7 @@ export class StatusBarController implements IWorkbenchContribution { private onDidAddRepository(repository: ISCMRepository): void { const changeDisposable = repository.onDidFocus(() => this.onDidFocusRepository(repository)); - const onDidRemove = filterEvent(this.scmService.onDidRemoveRepository, e => e === repository); + const onDidRemove = Event.filter(this.scmService.onDidRemoveRepository, e => e === repository); const removeDisposable = onDidRemove(() => { disposable.dispose(); this.disposables = this.disposables.filter(d => d !== removeDisposable); diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 84a0ebea6dd..3cf87f43ecd 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/scmViewlet'; import { localize } from 'vs/nls'; -import { Event, Emitter, chain, mapEvent, anyEvent, filterEvent, latch } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { domEvent, stop } from 'vs/base/browser/event'; import { basename } from 'vs/base/common/paths'; import { IDisposable, dispose, combinedDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -780,7 +780,7 @@ export class RepositoryPanel extends ViewletPanel { super.renderHeaderTitle(container, title); addClass(container, 'scm-provider'); append(container, $('span.type', null, type)); - const onContextMenu = mapEvent(stop(domEvent(container, 'contextmenu')), e => new StandardMouseEvent(e)); + const onContextMenu = Event.map(stop(domEvent(container, 'contextmenu')), e => new StandardMouseEvent(e)); onContextMenu(this.onContextMenu, this, this.disposables); } @@ -840,7 +840,7 @@ export class RepositoryPanel extends ViewletPanel { const onKeyUp = domEvent(this.inputBox.inputElement, 'keyup'); const onMouseUp = domEvent(this.inputBox.inputElement, 'mouseup'); - anyEvent(onKeyUp, onMouseUp)(triggerValidation, null, this.disposables); + Event.any(onKeyUp, onMouseUp)(triggerValidation, null, this.disposables); this.inputBox.value = this.repository.input.value; this.inputBox.onDidChange(value => this.repository.input.value = value, null, this.disposables); @@ -866,7 +866,7 @@ export class RepositoryPanel extends ViewletPanel { this.listContainer = append(container, $('.scm-status.show-file-icons')); const updateActionsVisibility = () => toggleClass(this.listContainer, 'show-actions', this.configurationService.getValue('scm.alwaysShowActions')); - filterEvent(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.alwaysShowActions'))(updateActionsVisibility); + Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.alwaysShowActions'))(updateActionsVisibility); updateActionsVisibility(); const delegate = new ProviderListDelegate(); @@ -883,12 +883,12 @@ export class RepositoryPanel extends ViewletPanel { typeLabelProvider: scmTypeLabelProvider }) as WorkbenchList; - chain(this.list.onOpen) + Event.chain(this.list.onOpen) .map(e => e.elements[0]) .filter(e => !!e && isSCMResource(e)) .on(this.open, this, this.disposables); - chain(this.list.onPin) + Event.chain(this.list.onPin) .map(e => e.elements[0]) .filter(e => !!e && isSCMResource(e)) .on(this.pin, this, this.disposables); @@ -1106,7 +1106,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel, IViewsViewle this.scmService.onDidRemoveRepository(this.onDidRemoveRepository, this, this.disposables); this.scmService.repositories.forEach(r => this.onDidAddRepository(r)); - const onDidUpdateConfiguration = filterEvent(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.alwaysShowProviders')); + const onDidUpdateConfiguration = Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.alwaysShowProviders')); onDidUpdateConfiguration(this.onDidChangeRepositories, this, this.disposables); this.onDidChangeRepositories(); @@ -1382,7 +1382,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel, IViewsViewle this.onViewHeaderContextMenu(new StandardMouseEvent(e), viewDescriptor); }); - const collapseDisposable = latch(mapEvent(panel.onDidChange, () => !panel.isExpanded()))(collapsed => { + const collapseDisposable = Event.latch(Event.map(panel.onDidChange, () => !panel.isExpanded()))(collapsed => { this.contributedViews.setCollapsed(viewDescriptor.id, collapsed); }); diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index 8c58c52aed5..3af80436f0f 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -11,7 +11,7 @@ import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; import { IAction } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; import * as errors from 'vs/base/common/errors'; -import { anyEvent, debounceEvent, Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import * as paths from 'vs/base/common/paths'; @@ -160,7 +160,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this._register(this.searchHistoryService.onDidClearHistory(() => this.clearHistory())); this.selectCurrentMatchEmitter = this._register(new Emitter()); - this._register(debounceEvent(this.selectCurrentMatchEmitter.event, (l, e) => e, 100, /*leading=*/true) + this._register(Event.debounce(this.selectCurrentMatchEmitter.event, (l, e) => e, 100, /*leading=*/true) (() => this.selectCurrentMatch())); this.delayedRefresh = this._register(new Delayer(250)); @@ -536,7 +536,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.tree.setInput(this.viewModel.searchResult); const searchResultsNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true })); - this._register(debounceEvent(searchResultsNavigator.openResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(searchResultsNavigator.openResource, (last, event) => event, 75, true)(options => { if (options.element instanceof Match) { let selectedMatch: Match = options.element; if (this.currentSelectedFileMatch) { @@ -550,7 +550,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } })); - this._register(anyEvent(this.tree.onDidFocus, this.tree.onDidChangeFocus)(() => { + this._register(Event.any(this.tree.onDidFocus, this.tree.onDidChangeFocus)(() => { if (this.tree.isDOMFocused()) { const focus = this.tree.getFocus(); this.firstMatchFocused.set(this.tree.getNavigator().first() === focus); diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index e875da9a77c..196b9e50263 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -6,7 +6,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; -import { anyEvent, Emitter, Event, fromPromise, stopwatch } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { getBaseLabel } from 'vs/base/common/labels'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap, TernarySearchTree, values } from 'vs/base/common/map'; @@ -690,7 +690,7 @@ export class SearchResult extends Disposable { this.replacingAll = true; const promise = this.replaceService.replace(this.matches(), progressRunner); - const onDone = stopwatch(fromPromise(promise)); + const onDone = Event.stopwatch(Event.fromPromise(promise)); /* __GDPR__ "replaceAll.started" : { "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true } @@ -861,9 +861,9 @@ export class SearchModel extends Disposable { const dispose = () => tokenSource.dispose(); currentRequest.then(dispose, dispose); - const onDone = fromPromise(currentRequest); - const onFirstRender = anyEvent(onDone, progressEmitter.event); - const onFirstRenderStopwatch = stopwatch(onFirstRender); + const onDone = Event.fromPromise(currentRequest); + const onFirstRender = Event.any(onDone, progressEmitter.event); + const onFirstRenderStopwatch = Event.stopwatch(onFirstRender); /* __GDPR__ "searchResultsFirstRender" : { "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true } @@ -871,7 +871,7 @@ export class SearchModel extends Disposable { */ onFirstRenderStopwatch(duration => this.telemetryService.publicLog('searchResultsFirstRender', { duration })); - const onDoneStopwatch = stopwatch(onDone); + const onDoneStopwatch = Event.stopwatch(onDone); const start = Date.now(); /* __GDPR__ diff --git a/src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts index fd8fb4702ff..3a61bf4ac74 100644 --- a/src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts @@ -6,7 +6,7 @@ import { onDidChangeFullscreen, isFullscreen } from 'vs/base/browser/browser'; import { getTotalHeight, getTotalWidth } from 'vs/base/browser/dom'; import { Color } from 'vs/base/common/color'; -import { anyEvent, debounceEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IBroadcastService } from 'vs/platform/broadcast/electron-browser/broadcastService'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; @@ -38,7 +38,7 @@ class PartsSplash { @IBroadcastService private broadcastService: IBroadcastService ) { lifecycleService.when(LifecyclePhase.Restored).then(_ => this._removePartsSplash()); - debounceEvent(anyEvent( + Event.debounce(Event.any( onDidChangeFullscreen, _partService.onEditorLayout ), () => { }, 800)(this._savePartsSplash, this, this._disposables); diff --git a/src/vs/workbench/parts/terminal/browser/terminalTab.ts b/src/vs/workbench/parts/terminal/browser/terminalTab.ts index 38b5fbe58df..14702feb80c 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/parts/terminal/browser/terminalTab.ts @@ -6,7 +6,7 @@ import * as aria from 'vs/base/browser/ui/aria/aria'; import * as nls from 'vs/nls'; import { ITerminalInstance, IShellLaunchConfig, ITerminalTab, Direction, ITerminalService, ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { Event, Emitter, anyEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { SplitView, Orientation, IView, Sizing } from 'vs/base/browser/ui/splitview/splitview'; import { IPartService, Position } from 'vs/workbench/services/part/common/partService'; @@ -105,7 +105,7 @@ class SplitPaneContainer { this._withDisabledLayout(() => this._splitView.addView(child, Sizing.Distribute, index)); - this._onDidChange = anyEvent(...this._children.map(c => c.onDidChange)); + this._onDidChange = Event.any(...this._children.map(c => c.onDidChange)); } public remove(instance: ITerminalInstance): void { diff --git a/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts b/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts index c1df2481eda..09b1fd8ce46 100644 --- a/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts +++ b/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as platform from 'vs/base/common/platform'; -import { Emitter, debounceEvent } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { ITerminalInstance } from 'vs/workbench/parts/terminal/common/terminal'; import { Terminal as XTermTerminal } from 'vscode-xterm'; import WindowsProcessTreeType = require('windows-process-tree'); @@ -50,7 +50,7 @@ export class WindowsShellHelper { this._onCheckShell = new Emitter>(); // The debounce is necessary to prevent multiple processes from spawning when // the enter key or output is spammed - debounceEvent(this._onCheckShell.event, (l, e) => e, 150, true)(() => { + Event.debounce(this._onCheckShell.event, (l, e) => e, 150, true)(() => { setTimeout(() => { this.checkShell(); }, 50); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 9dbe376ea19..1bd289fda4d 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -23,7 +23,7 @@ import { localize } from 'vs/nls'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { isObject } from 'vs/base/common/types'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; @@ -356,7 +356,7 @@ export class WalkThroughPart extends BaseEditor { } })); - this.contentDisposables.push(once(editor.onMouseDown)(() => { + this.contentDisposables.push(Event.once(editor.onMouseDown)(() => { /* __GDPR__ "walkThroughSnippetInteraction" : { "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, @@ -370,7 +370,7 @@ export class WalkThroughPart extends BaseEditor { snippet: i }); })); - this.contentDisposables.push(once(editor.onKeyDown)(() => { + this.contentDisposables.push(Event.once(editor.onKeyDown)(() => { /* __GDPR__ "walkThroughSnippetInteraction" : { "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, @@ -384,7 +384,7 @@ export class WalkThroughPart extends BaseEditor { snippet: i }); })); - this.contentDisposables.push(once(editor.onDidChangeModelContent)(() => { + this.contentDisposables.push(Event.once(editor.onDidChangeModelContent)(() => { /* __GDPR__ "walkThroughSnippetInteraction" : { "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, diff --git a/src/vs/workbench/services/commands/common/commandService.ts b/src/vs/workbench/services/commands/common/commandService.ts index 7de13edb749..4bcf865fc8f 100644 --- a/src/vs/workbench/services/commands/common/commandService.ts +++ b/src/vs/workbench/services/commands/common/commandService.ts @@ -6,7 +6,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService, ICommandEvent, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { Event, Emitter, filterEvent, toPromise } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; @@ -46,7 +46,7 @@ export class CommandService extends Disposable implements ICommandService { waitFor = Promise.race([ // race activation events against command registration Promise.all([activation, this._extensionService.activateByEvent(`*`)]), - toPromise(filterEvent(CommandsRegistry.onDidRegisterCommand, e => e === id)), + Event.toPromise(Event.filter(CommandsRegistry.onDidRegisterCommand, e => e === id)), ]); } return (waitFor as Promise).then(_ => this._tryExecuteCommand(id, args)); diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index cddc0eea7fb..abf01097120 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { Event, Emitter, debounceEvent, anyEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { IDecorationsService, IDecoration, IResourceDecorationChangeEvent, IDecorationsProvider, IDecorationData } from './decorations'; import { TernarySearchTree } from 'vs/base/common/map'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; @@ -343,9 +343,9 @@ export class FileDecorationsService implements IDecorationsService { private readonly _decorationStyles: DecorationStyles; private readonly _disposables: IDisposable[]; - readonly onDidChangeDecorations: Event = anyEvent( + readonly onDidChangeDecorations: Event = Event.any( this._onDidChangeDecorations.event, - debounceEvent( + Event.debounce( this._onDidChangeDecorationsDelayed.event, FileDecorationChangeEvent.debouncer, undefined, undefined, 500 diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts index c183860eab6..45e6887137f 100644 --- a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { FileDecorationsService } from 'vs/workbench/services/decorations/browser/decorationsService'; import { IDecorationsProvider, IDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; import { URI } from 'vs/base/common/uri'; -import { Event, toPromise, Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -46,7 +46,7 @@ suite('DecorationsService', function () { assert.equal(callCounter, 1); // event when result is computed - return toPromise(service.onDidChangeDecorations).then(e => { + return Event.toPromise(service.onDidChangeDecorations).then(e => { assert.equal(e.affectsResource(uri), true); // sync result diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index bb766b60196..070691ba3e4 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -13,7 +13,7 @@ import { ResourceMap } from 'vs/base/common/map'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IFileService } from 'vs/platform/files/common/files'; import { Schemas } from 'vs/base/common/network'; -import { Event, once, Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { basename } from 'vs/base/common/paths'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; @@ -138,7 +138,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { this._onDidOpenEditorFail.fire({ editor, groupId: group.id }); })); - once(group.onWillDispose)(() => { + Event.once(group.onWillDispose)(() => { dispose(groupDisposeables); }); } @@ -577,7 +577,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } EditorService.CACHE.set(resource, input); - once(input.onDispose)(() => { + Event.once(input.onDispose)(() => { EditorService.CACHE.delete(resource); }); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index d01e90b0c72..ebf5d91b83e 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -11,7 +11,7 @@ import { getPathFromAmdModule } from 'vs/base/common/amd'; import { timeout } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { Emitter, Event, anyEvent, debounceEvent, fromNodeEventEmitter, mapEvent } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import * as objects from 'vs/base/common/objects'; @@ -212,15 +212,15 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { type Output = { data: string, format: string[] }; this._extensionHostProcess.stdout.setEncoding('utf8'); this._extensionHostProcess.stderr.setEncoding('utf8'); - const onStdout = fromNodeEventEmitter(this._extensionHostProcess.stdout, 'data'); - const onStderr = fromNodeEventEmitter(this._extensionHostProcess.stderr, 'data'); - const onOutput = anyEvent( - mapEvent(onStdout, o => ({ data: `%c${o}`, format: [''] })), - mapEvent(onStderr, o => ({ data: `%c${o}`, format: ['color: red'] })) + const onStdout = Event.fromNodeEventEmitter(this._extensionHostProcess.stdout, 'data'); + const onStderr = Event.fromNodeEventEmitter(this._extensionHostProcess.stderr, 'data'); + const onOutput = Event.any( + Event.map(onStdout, o => ({ data: `%c${o}`, format: [''] })), + Event.map(onStderr, o => ({ data: `%c${o}`, format: ['color: red'] })) ); // Debounce all output, so we can render it in the Chrome console as a group - const onDebouncedOutput = debounceEvent(onOutput, (r, o) => { + const onDebouncedOutput = Event.debounce(onOutput, (r, o) => { return r ? { data: r.data + o.data, format: [...r.format, ...o.format] } : { data: o.data, format: o.format }; diff --git a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts b/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts index bd201a3867a..ca03fc923e8 100644 --- a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts @@ -12,7 +12,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; -import { filterEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IWatchError } from 'vs/workbench/services/files/node/watcher/nsfw/watcher'; import { getPathFromAmdModule } from 'vs/base/common/amd'; @@ -69,12 +69,12 @@ export class FileWatcher { this.service = new WatcherChannelClient(channel); const options = { verboseLogging: this.verboseLogging }; - const onWatchEvent = filterEvent(this.service.watch(options), () => !this.isDisposed); + const onWatchEvent = Event.filter(this.service.watch(options), () => !this.isDisposed); - const onError = filterEvent(onWatchEvent, (e): e is IWatchError => typeof e.message === 'string'); + const onError = Event.filter(onWatchEvent, (e): e is IWatchError => typeof e.message === 'string'); onError(err => this.errorLogger(err.message), null, this.toDispose); - const onFileChanges = filterEvent(onWatchEvent, (e): e is IRawFileChange[] => Array.isArray(e) && e.length > 0); + const onFileChanges = Event.filter(onWatchEvent, (e): e is IRawFileChange[] => Array.isArray(e) && e.length > 0); onFileChanges(e => this.onFileChanges(toFileChangesEvent(e)), null, this.toDispose); // Start watching diff --git a/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts index 7c52f216585..7e3a3248307 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts @@ -12,7 +12,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Schemas } from 'vs/base/common/network'; -import { filterEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IWatchError } from 'vs/workbench/services/files/node/watcher/unix/watcher'; import { getPathFromAmdModule } from 'vs/base/common/amd'; @@ -71,12 +71,12 @@ export class FileWatcher { this.service = new WatcherChannelClient(channel); const options = { verboseLogging: this.verboseLogging }; - const onWatchEvent = filterEvent(this.service.watch(options), () => !this.isDisposed); + const onWatchEvent = Event.filter(this.service.watch(options), () => !this.isDisposed); - const onError = filterEvent(onWatchEvent, (e): e is IWatchError => typeof e.message === 'string'); + const onError = Event.filter(onWatchEvent, (e): e is IWatchError => typeof e.message === 'string'); onError(err => this.errorLogger(err.message), null, this.toDispose); - const onFileChanges = filterEvent(onWatchEvent, (e): e is IRawFileChange[] => Array.isArray(e) && e.length > 0); + const onFileChanges = Event.filter(onWatchEvent, (e): e is IRawFileChange[] => Array.isArray(e) && e.length > 0); onFileChanges(e => this.onFileChanges(toFileChangesEvent(e)), null, this.toDispose); // Start watching diff --git a/src/vs/workbench/services/history/electron-browser/history.ts b/src/vs/workbench/services/history/electron-browser/history.ts index eb019a2e422..55ac6935878 100644 --- a/src/vs/workbench/services/history/electron-browser/history.ts +++ b/src/vs/workbench/services/history/electron-browser/history.ts @@ -16,7 +16,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Registry } from 'vs/platform/registry/common/platform'; -import { once, debounceEvent } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; import { IWindowsService } from 'vs/platform/windows/common/windows'; @@ -208,14 +208,14 @@ export class HistoryService extends Disposable implements IHistoryService { // Debounce the event with a timeout of 0ms so that multiple calls to // editor.setSelection() are folded into one. We do not want to record // subsequent history navigations for such API calls. - this.activeEditorListeners.push(debounceEvent(activeTextEditorWidget.onDidChangeCursorPosition, (last, event) => event, 0)((event => { + this.activeEditorListeners.push(Event.debounce(activeTextEditorWidget.onDidChangeCursorPosition, (last, event) => event, 0)((event => { this.handleEditorSelectionChangeEvent(activeControl, event); }))); // Track the last edit location by tracking model content change events // Use a debouncer to make sure to capture the correct cursor position // after the model content has changed. - this.activeEditorListeners.push(debounceEvent(activeTextEditorWidget.onDidChangeModelContent, (last, event) => event, 0)((event => { + this.activeEditorListeners.push(Event.debounce(activeTextEditorWidget.onDidChangeModelContent, (last, event) => event, 0)((event => { this.lastEditLocation = { input: activeEditor }; const position = activeTextEditorWidget.getPosition(); @@ -468,7 +468,7 @@ export class HistoryService extends Disposable implements IHistoryService { } private onEditorDispose(editor: EditorInput, listener: Function, mapEditorToDispose: Map): void { - const toDispose = once(editor.onDispose)(() => listener()); + const toDispose = Event.once(editor.onDispose)(() => listener()); let disposables = mapEditorToDispose.get(editor); if (!disposables) { diff --git a/src/vs/workbench/services/notification/common/notificationService.ts b/src/vs/workbench/services/notification/common/notificationService.ts index 23775b9b487..0864b7d9aaa 100644 --- a/src/vs/workbench/services/notification/common/notificationService.ts +++ b/src/vs/workbench/services/notification/common/notificationService.ts @@ -6,7 +6,7 @@ import { INotificationService, INotification, INotificationHandle, Severity, NotificationMessage, INotificationActions, IPromptChoice, IPromptOptions } from 'vs/platform/notification/common/notification'; import { INotificationsModel, NotificationsModel, ChoiceAction } from 'vs/workbench/common/notifications'; import { dispose, Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export class NotificationService extends Disposable implements INotificationService { @@ -90,7 +90,7 @@ export class NotificationService extends Disposable implements INotificationServ // Show notification with actions handle = this.notify({ severity, message, actions, sticky: options && options.sticky, silent: options && options.silent }); - once(handle.onDidClose)(() => { + Event.once(handle.onDidClose)(() => { // Cleanup when notification gets disposed dispose(toDispose); diff --git a/src/vs/workbench/services/progress/browser/progressService2.ts b/src/vs/workbench/services/progress/browser/progressService2.ts index 660c66a8a42..c7ec6fba35c 100644 --- a/src/vs/workbench/services/progress/browser/progressService2.ts +++ b/src/vs/workbench/services/progress/browser/progressService2.ts @@ -14,7 +14,7 @@ import { always, timeout } from 'vs/base/common/async'; import { ProgressBadge, IActivityService } from 'vs/workbench/services/activity/common/activity'; import { INotificationService, Severity, INotificationHandle, INotificationActions } from 'vs/platform/notification/common/notification'; import { Action } from 'vs/base/common/actions'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export class ProgressService2 implements IProgressService2 { @@ -165,7 +165,7 @@ export class ProgressService2 implements IProgressService2 { updateProgress(handle, increment); - once(handle.onDidClose)(() => { + Event.once(handle.onDidClose)(() => { dispose(toDispose); }); diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts index 197db396d12..3fac14c2d09 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event, Emitter, debounceEvent } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { URI } from 'vs/base/common/uri'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; @@ -105,7 +105,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE } private debounce(event: Event): Event { - return debounceEvent(event, (prev: TextFileModelChangeEvent[], cur: TextFileModelChangeEvent) => { + return Event.debounce(event, (prev: TextFileModelChangeEvent[], cur: TextFileModelChangeEvent) => { if (!prev) { prev = [cur]; } else { diff --git a/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts b/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts index fbdc17701e5..cb744538e93 100644 --- a/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts +++ b/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts @@ -18,7 +18,7 @@ import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textF import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; -import { once } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; import { snapshotToString } from 'vs/platform/files/common/files'; class ServiceAccessor { @@ -75,7 +75,7 @@ suite('Workbench - TextModelResolverService', () => { let disposed = false; let disposedPromise = new Promise(resolve => { - once(model.onDispose)(() => { + Event.once(model.onDispose)(() => { disposed = true; resolve(); }); @@ -101,7 +101,7 @@ suite('Workbench - TextModelResolverService', () => { assert.equal(editorModel.getValue(), 'Hello Html'); let disposed = false; - once(model.onDispose)(() => { + Event.once(model.onDispose)(() => { disposed = true; }); diff --git a/src/vs/workbench/services/untitled/common/untitledEditorService.ts b/src/vs/workbench/services/untitled/common/untitledEditorService.ts index fee3761702e..8d32b6cadcc 100644 --- a/src/vs/workbench/services/untitled/common/untitledEditorService.ts +++ b/src/vs/workbench/services/untitled/common/untitledEditorService.ts @@ -9,7 +9,7 @@ import * as arrays from 'vs/base/common/arrays'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { IFilesConfiguration } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Event, Emitter, once } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { ResourceMap } from 'vs/base/common/map'; import { TPromise } from 'vs/base/common/winjs.base'; import { UntitledEditorModel } from 'vs/workbench/common/editor/untitledEditorModel'; @@ -246,7 +246,7 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor }); // Remove from cache on dispose - const onceDispose = once(input.onDispose); + const onceDispose = Event.once(input.onDispose); onceDispose(() => { this.mapResourceToInput.delete(input.getResource()); this.mapResourceToAssociatedFilePath.delete(input.getResource()); diff --git a/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts index bb02e8beec6..aff35ba5ee9 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts @@ -10,7 +10,7 @@ import { Diagnostic, DiagnosticSeverity, Range, DiagnosticRelatedInformation, Lo import { MainThreadDiagnosticsShape, IMainContext } from 'vs/workbench/api/node/extHost.protocol'; import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; -import { Emitter, toPromise } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; suite('ExtHostDiagnostics', () => { @@ -292,7 +292,7 @@ suite('ExtHostDiagnostics', () => { let diag2 = new Diagnostic(new Range(1, 1, 2, 3), 'diag2'); let diag3 = new Diagnostic(new Range(1, 1, 2, 3), 'diag3'); - let p = toPromise(emitter.event).then(a => { + let p = Event.toPromise(emitter.event).then(a => { assert.equal(a.length, 1); assert.equal(a[0].toString(), 'aa:bb'); assert.ok(URI.isUri(a[0])); @@ -300,7 +300,7 @@ suite('ExtHostDiagnostics', () => { collection.set(URI.parse('aa:bb'), []); await p; - p = toPromise(emitter.event).then(e => { + p = Event.toPromise(emitter.event).then(e => { assert.equal(e.length, 2); assert.ok(URI.isUri(e[0])); assert.ok(URI.isUri(e[1])); @@ -313,7 +313,7 @@ suite('ExtHostDiagnostics', () => { ]); await p; - p = toPromise(emitter.event).then(e => { + p = Event.toPromise(emitter.event).then(e => { assert.equal(e.length, 2); assert.ok(typeof e[0] === 'string'); assert.ok(typeof e[1] === 'string'); @@ -330,7 +330,7 @@ suite('ExtHostDiagnostics', () => { // delete collection.set(URI.parse('aa:bb'), [diag1]); - let p = toPromise(emitter.event).then(e => { + let p = Event.toPromise(emitter.event).then(e => { assert.equal(e[0].toString(), 'aa:bb'); }); collection.delete(URI.parse('aa:bb')); @@ -338,7 +338,7 @@ suite('ExtHostDiagnostics', () => { // set->undefined (as delete) collection.set(URI.parse('aa:bb'), [diag1]); - p = toPromise(emitter.event).then(e => { + p = Event.toPromise(emitter.event).then(e => { assert.equal(e[0].toString(), 'aa:bb'); }); collection.set(URI.parse('aa:bb'), undefined); diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts index 4b2d8d4387f..eb19c5d741c 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -29,7 +29,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { SearchModel } from 'vs/workbench/parts/search/common/searchModel'; import { QueryBuilder, ITextQueryBuilderOptions } from 'vs/workbench/parts/search/common/queryBuilder'; -import * as event from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { NullLogService, ILogService } from 'vs/platform/log/common/log'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; @@ -82,8 +82,8 @@ suite.skip('TextSearch performance (integration)', () => { const query = queryBuilder.text({ pattern: 'static_library(' }, [URI.file(testWorkspacePath)], queryOptions); // Wait for the 'searchResultsFinished' event, which is fired after the search() promise is resolved - const onSearchResultsFinished = event.filterEvent(telemetryService.eventLogged, e => e.name === 'searchResultsFinished'); - event.once(onSearchResultsFinished)(onComplete); + const onSearchResultsFinished = Event.filter(telemetryService.eventLogged, e => e.name === 'searchResultsFinished'); + Event.once(onSearchResultsFinished)(onComplete); function onComplete(): void { try { @@ -148,9 +148,9 @@ class TestTelemetryService implements ITelemetryService { public events: any[] = []; - private emitter = new event.Emitter(); + private emitter = new Emitter(); - public get eventLogged(): event.Event { + public get eventLogged(): Event { return this.emitter.event; }