提交 d83b859b 编写于 作者: J Joao Moreno

introduce ISequence

上级 cbb12ecc
......@@ -125,11 +125,15 @@ export function groupBy<T>(data: T[], compare: (a: T, b: T) => number): T[][] {
return result;
}
interface IMutableSplice<T> extends ISplice<T> {
deleteCount: number;
}
/**
* Diffs two *sorted* arrays and computes the splices which apply the diff.
*/
export function sortedDiff<T>(before: T[], after: T[], compare: (a: T, b: T) => number): ISplice<T>[] {
const result: ISplice<T>[] = [];
const result: IMutableSplice<T>[] = [];
function pushSplice(start: number, deleteCount: number, toInsert: T[]): void {
if (deleteCount === 0 && toInsert.length === 0) {
......
......@@ -5,12 +5,19 @@
'use strict';
import Event from 'vs/base/common/event';
export interface ISplice<T> {
start: number;
deleteCount: number;
toInsert: T[];
readonly start: number;
readonly deleteCount: number;
readonly toInsert: T[];
}
export interface ISpliceable<T> {
splice(start: number, deleteCount: number, toInsert: T[]): void;
}
export interface ISequence<T> {
readonly elements: T[];
readonly onDidSplice: Event<ISplice<T>>;
}
\ No newline at end of file
......@@ -10,28 +10,28 @@ import URI from 'vs/base/common/uri';
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, ISCMResourceCollection } from 'vs/workbench/services/scm/common/scm';
import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations } from 'vs/workbench/services/scm/common/scm';
import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, IExtHostContext } from '../node/extHost.protocol';
import { Command } from 'vs/editor/common/modes';
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
import { ISplice } from 'vs/base/common/sequence';
import { ISplice, ISequence } from 'vs/base/common/sequence';
class MainThreadSCMResourceCollection implements ISCMResourceCollection {
class MainThreadSCMResourceCollection implements ISequence<ISCMResource> {
readonly resources: ISCMResource[] = [];
readonly elements: ISCMResource[] = [];
private _onDidSplice = new Emitter<ISplice<ISCMResource>>();
readonly onDidSplice = this._onDidSplice.event;
splice(start: number, deleteCount: number, toInsert: ISCMResource[]) {
this.resources.splice(start, deleteCount, ...toInsert);
this.elements.splice(start, deleteCount, ...toInsert);
this._onDidSplice.fire({ start, deleteCount, toInsert });
}
}
class MainThreadSCMResourceGroup implements ISCMResourceGroup {
readonly resourceCollection = new MainThreadSCMResourceCollection();
readonly resources = new MainThreadSCMResourceCollection();
get hideWhenEmpty(): boolean { return this.features.hideWhenEmpty; }
constructor(
......@@ -89,7 +89,7 @@ class MainThreadSCMProvider implements ISCMProvider {
get resources(): ISCMResourceGroup[] {
return this._groups
.filter(g => g.resourceCollection.resources.length > 0 || !g.features.hideWhenEmpty);
.filter(g => g.resources.elements.length > 0 || !g.features.hideWhenEmpty);
}
private _onDidChangeResources = new Emitter<void>();
......@@ -206,7 +206,7 @@ class MainThreadSCMProvider implements ISCMProvider {
);
});
group.resourceCollection.splice(start, deleteCount, resources);
group.resources.splice(start, deleteCount, resources);
}
}
......
......@@ -58,7 +58,7 @@ export class StatusUpdater implements IWorkbenchContribution {
if (typeof repository.provider.count === 'number') {
return r + repository.provider.count;
} else {
return r + repository.provider.resources.reduce<number>((r, g) => r + g.resourceCollection.resources.length, 0);
return r + repository.provider.resources.reduce<number>((r, g) => r + g.resources.elements.length, 0);
}
}, 0);
......
......@@ -371,7 +371,7 @@ class ResourceGroupRenderer implements IRenderer<ISCMResourceGroup, ResourceGrou
renderElement(group: ISCMResourceGroup, index: number, template: ResourceGroupTemplate): void {
template.name.textContent = group.label;
template.count.setCount(group.resourceCollection.resources.length);
template.count.setCount(group.resources.elements.length);
template.actionBar.clear();
template.actionBar.context = group;
template.actionBar.push(this.scmMenus.getResourceGroupActions(group), { icon: true, label: false });
......@@ -681,11 +681,11 @@ export class RepositoryPanel extends ViewletPanel {
private updateList(): void {
const elements = this.repository.provider.resources
.reduce<(ISCMResourceGroup | ISCMResource)[]>((r, g) => {
if (g.resourceCollection.resources.length === 0 && g.hideWhenEmpty) {
if (g.resources.elements.length === 0 && g.hideWhenEmpty) {
return r;
}
return [...r, g, ...g.resourceCollection.resources];
return [...r, g, ...g.resources.elements];
}, []);
this.list.splice(0, this.list.length, elements);
......
......@@ -12,7 +12,7 @@ import Event from 'vs/base/common/event';
import { IDisposable } from 'vs/base/common/lifecycle';
import { Command } from 'vs/editor/common/modes';
import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry';
import { ISplice } from 'vs/base/common/sequence';
import { ISequence } from 'vs/base/common/sequence';
export interface IBaselineResourceProvider {
getBaselineResource(resource: URI): TPromise<URI>;
......@@ -32,11 +32,6 @@ export interface ISCMResourceDecorations {
color?: ColorIdentifier;
}
export interface ISCMResourceCollection {
readonly resources: ISCMResource[];
readonly onDidSplice: Event<ISplice<ISCMResource>>;
}
export interface ISCMResource {
readonly resourceGroup: ISCMResourceGroup;
readonly sourceUri: URI;
......@@ -48,7 +43,7 @@ export interface ISCMResourceGroup {
readonly provider: ISCMProvider;
readonly label: string;
readonly id: string;
readonly resourceCollection: ISCMResourceCollection;
readonly resources: ISequence<ISCMResource>;
readonly hideWhenEmpty: boolean;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册