make TST#findSuperstr return another TST

This commit is contained in:
Johannes Rieken 2017-10-05 15:12:54 +02:00
parent 39130b09e6
commit d3e23ae223
3 changed files with 21 additions and 23 deletions

View file

@ -418,35 +418,33 @@ export class TernarySearchTree<E> {
} else {
return node.element || candidate;
}
}
findSuperstr(key: string): E[] {
findSuperstr(key: string): TernarySearchTree<E> {
const segements = this._segments.reset(key);
const bucket: E[] = [];
this._findSuperstr(this._root, segements.next(), segements, bucket);
return bucket.length ? bucket : undefined;
return this._findSuperstr(this._root, segements.next(), segements);
}
private _findSuperstr(node: TernarySearchTreeNode<E>, key: string, segments: IKeySegements, bucket: E[]): void {
private _findSuperstr(node: TernarySearchTreeNode<E>, key: string, segments: IKeySegements): TernarySearchTree<E> {
if (!node) {
return;
return undefined;
} else if (node.str > key) {
// left
this._findSuperstr(node.left, key, segments, bucket);
return this._findSuperstr(node.left, key, segments);
} else if (node.str < key) {
// right
this._findSuperstr(node.right, key, segments, bucket);
return this._findSuperstr(node.right, key, segments);
} else if (segments.hasNext()) {
// mid
this._findSuperstr(node.mid, segments.next(), segments, bucket);
return this._findSuperstr(node.mid, segments.next(), segments);
} else {
// collect
if (node.element) {
bucket.push(node.element);
if (!node.mid) {
return undefined;
}
this._forEach(node.mid, [], (entry) => bucket.push(entry[1]));
let ret = new TernarySearchTree<E>(this._segments);
ret._root = node.mid;
return ret;
}
}

View file

@ -453,15 +453,16 @@ suite('Map', () => {
map.set('/usr/foo', 4);
const elements = map.findSuperstr('/user');
const [first, second, third] = elements.sort();
assert.equal(elements.length, 3);
assert.equal(first, 1);
assert.equal(second, 2);
assert.equal(third, 3);
assertTernarySearchTree(elements, ['foo/bar', 1], ['foo', 2], ['foo/flip/flop', 3]);
// assert.equal(elements.length, 3);
assert.equal(elements.get('foo/bar'), 1);
assert.equal(elements.get('foo'), 2);
assert.equal(elements.get('foo/flip/flop'), 3);
assert.deepEqual(map.findSuperstr('/usr'), [4]);
assert.deepEqual(map.findSuperstr('/usr/foo'), [4]);
assertTernarySearchTree(map.findSuperstr('/usr'), ['foo', 4]);
assert.equal(map.findSuperstr('/usr/foo'), undefined);
assert.equal(map.get('/usr/foo'), 4);
assert.equal(map.findSuperstr('/not'), undefined);
assert.equal(map.findSuperstr('/us'), undefined);

View file

@ -72,8 +72,7 @@ export function toDeepIFileStat(provider: IFileSystemProvider, tuple: [URI, ISta
}
return toIFileStat(provider, tuple, candidate => {
const sub = trie.findSuperstr(candidate[0].toString());
return !!sub;
return Boolean(trie.findSuperstr(candidate[0].toString()) || trie.get(candidate[0].toString()));
});
}