-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathRBSegmentsCacheInMemory.ts
More file actions
72 lines (54 loc) · 1.88 KB
/
RBSegmentsCacheInMemory.ts
File metadata and controls
72 lines (54 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { IRBSegment } from '../../dtos/types';
import { setToArray } from '../../utils/lang/sets';
import { usesSegments } from '../AbstractSplitsCacheSync';
import { IRBSegmentsCacheSync } from '../types';
export class RBSegmentsCacheInMemory implements IRBSegmentsCacheSync {
private cache: Record<string, IRBSegment> = {};
private changeNumber: number = -1;
private segmentsCount: number = 0;
clear() {
this.cache = {};
this.changeNumber = -1;
this.segmentsCount = 0;
}
update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): boolean {
this.changeNumber = changeNumber;
const updated = toAdd.map(toAdd => this.add(toAdd)).some(result => result);
return toRemove.map(toRemove => this.remove(toRemove.name)).some(result => result) || updated;
}
private add(rbSegment: IRBSegment): boolean {
const name = rbSegment.name;
const previous = this.get(name);
if (previous && usesSegments(previous)) this.segmentsCount--;
this.cache[name] = rbSegment;
if (usesSegments(rbSegment)) this.segmentsCount++;
return true;
}
private remove(name: string): boolean {
const rbSegment = this.get(name);
if (!rbSegment) return false;
delete this.cache[name];
if (usesSegments(rbSegment)) this.segmentsCount--;
return true;
}
private getNames(): string[] {
return Object.keys(this.cache);
}
get(name: string): IRBSegment | null {
return this.cache[name] || null;
}
getAll(): IRBSegment[] {
return this.getNames().map(name => this.get(name) as IRBSegment);
}
contains(names: Set<string>): boolean {
const namesArray = setToArray(names);
const namesInStorage = this.getNames();
return namesArray.every(name => namesInStorage.indexOf(name) !== -1);
}
getChangeNumber(): number {
return this.changeNumber;
}
usesSegments(): boolean {
return this.segmentsCount > 0;
}
}