diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index aaad604db4c..b79e3bd0c53 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -40,6 +40,17 @@ export class LinkedMap { return value ? value : null; } + public getOrSet(k: K, t: T): T { + const res = this.get(k); + if (res) { + return res; + } + + this.set(k, t); + + return t; + } + public keys(): K[] { var keys: K[] = []; for (let key in this.map) { @@ -152,6 +163,17 @@ export class BoundedLinkedMap { return entry ? entry.value : null; } + public getOrSet(k: string, t: T): T { + const res = this.get(k); + if (res) { + return res; + } + + this.set(k, t); + + return t; + } + public delete(key: string): T { const entry = this.map[key]; @@ -273,4 +295,4 @@ export class LRUCache extends BoundedLinkedMap { return null; } -} \ No newline at end of file +} diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index 25e796b2339..6c219c8fd8e 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -5,10 +5,72 @@ 'use strict'; -import {BoundedLinkedMap, LRUCache} from 'vs/base/common/map'; +import {BoundedLinkedMap, LRUCache, LinkedMap} from 'vs/base/common/map'; import * as assert from 'assert'; suite('Map', () => { + + test('LinkedMap - basics', function () { + const map = new LinkedMap(); + + assert.equal(map.size, 0); + + map.set('1', 1); + map.set('2', '2'); + map.set('3', true); + + const obj = Object.create(null); + map.set('4', obj); + + const date = Date.now(); + map.set('5', date); + + assert.equal(map.size, 5); + assert.equal(map.get('1'), 1); + assert.equal(map.get('2'), '2'); + assert.equal(map.get('3'), true); + assert.equal(map.get('4'), obj); + assert.equal(map.get('5'), date); + assert.ok(!map.get('6')); + + map.delete('6'); + assert.equal(map.size, 5); + assert.equal(map.delete('1'), 1); + assert.equal(map.delete('2'), '2'); + assert.equal(map.delete('3'), true); + assert.equal(map.delete('4'), obj); + assert.equal(map.delete('5'), date); + + assert.equal(map.size, 0); + assert.ok(!map.get('5')); + assert.ok(!map.get('4')); + assert.ok(!map.get('3')); + assert.ok(!map.get('2')); + assert.ok(!map.get('1')); + + map.set('1', 1); + map.set('2', '2'); + assert.ok(map.set('3', true)); // adding an element returns true + assert.ok(!map.set('3', true)); // adding it again returns false + + assert.ok(map.has('1')); + assert.equal(map.get('1'), 1); + assert.equal(map.get('2'), '2'); + assert.equal(map.get('3'), true); + + map.clear(); + + assert.equal(map.size, 0); + assert.ok(!map.get('1')); + assert.ok(!map.get('2')); + assert.ok(!map.get('3')); + assert.ok(!map.has('1')); + + const res = map.getOrSet('foo', 'bar'); + assert.equal(map.get('foo'), res); + assert.equal(res, 'bar'); + }); + test('BoundedLinkedMap - basics', function () { const map = new BoundedLinkedMap(); @@ -64,6 +126,10 @@ suite('Map', () => { assert.ok(!map.get('2')); assert.ok(!map.get('3')); assert.ok(!map.has('1')); + + const res = map.getOrSet('foo', 'bar'); + assert.equal(map.get('foo'), res); + assert.equal(res, 'bar'); }); test('BoundedLinkedMap - bounded', function () { @@ -204,6 +270,5 @@ suite('Map', () => { assert.equal(cache.get('6'), 6); assert.ok(!cache.has('3')); assert.ok(!cache.has('4')); - }); });