vscroll 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/dist/bundles/vscroll.esm5.js +5704 -5694
- package/dist/bundles/vscroll.esm5.js.map +1 -1
- package/dist/bundles/vscroll.esm5.min.js +2 -2
- package/dist/bundles/vscroll.esm5.min.js.map +1 -1
- package/dist/bundles/vscroll.esm6.js +5193 -5183
- package/dist/bundles/vscroll.esm6.js.map +1 -1
- package/dist/bundles/vscroll.esm6.min.js +2 -2
- package/dist/bundles/vscroll.esm6.min.js.map +1 -1
- package/dist/bundles/vscroll.umd.js +5712 -5703
- package/dist/bundles/vscroll.umd.js.map +1 -1
- package/dist/bundles/vscroll.umd.min.js +2 -2
- package/dist/bundles/vscroll.umd.min.js.map +1 -1
- package/dist/esm2015/classes/adapter/context.js +43 -43
- package/dist/esm2015/classes/adapter/context.js.map +1 -1
- package/dist/esm2015/classes/adapter/props.js +300 -300
- package/dist/esm2015/classes/adapter/wanted.js +28 -28
- package/dist/esm2015/classes/adapter/wanted.js.map +1 -1
- package/dist/esm2015/classes/adapter.js +487 -487
- package/dist/esm2015/classes/adapter.js.map +1 -1
- package/dist/esm2015/classes/buffer/cache.js +246 -246
- package/dist/esm2015/classes/buffer/cache.js.map +1 -1
- package/dist/esm2015/classes/buffer/checkCall.js +48 -48
- package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
- package/dist/esm2015/classes/buffer/defaultSize.js +127 -127
- package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
- package/dist/esm2015/classes/buffer.js +342 -342
- package/dist/esm2015/classes/buffer.js.map +1 -1
- package/dist/esm2015/classes/datasource.js +23 -24
- package/dist/esm2015/classes/datasource.js.map +1 -1
- package/dist/esm2015/classes/domRoutines.js +160 -160
- package/dist/esm2015/classes/domRoutines.js.map +1 -1
- package/dist/esm2015/classes/item.js +61 -61
- package/dist/esm2015/classes/item.js.map +1 -1
- package/dist/esm2015/classes/logger.js +186 -186
- package/dist/esm2015/classes/logger.js.map +1 -1
- package/dist/esm2015/classes/paddings.js +72 -72
- package/dist/esm2015/classes/paddings.js.map +1 -1
- package/dist/esm2015/classes/reactive.js +54 -54
- package/dist/esm2015/classes/reactive.js.map +1 -1
- package/dist/esm2015/classes/settings.js +39 -39
- package/dist/esm2015/classes/settings.js.map +1 -1
- package/dist/esm2015/classes/state/clip.js +16 -16
- package/dist/esm2015/classes/state/clip.js.map +1 -1
- package/dist/esm2015/classes/state/cycle.js +60 -60
- package/dist/esm2015/classes/state/cycle.js.map +1 -1
- package/dist/esm2015/classes/state/fetch.js +122 -122
- package/dist/esm2015/classes/state/fetch.js.map +1 -1
- package/dist/esm2015/classes/state/render.js +14 -14
- package/dist/esm2015/classes/state/scroll.js +30 -30
- package/dist/esm2015/classes/state/scroll.js.map +1 -1
- package/dist/esm2015/classes/state.js +62 -62
- package/dist/esm2015/classes/state.js.map +1 -1
- package/dist/esm2015/classes/viewport.js +72 -72
- package/dist/esm2015/classes/viewport.js.map +1 -1
- package/dist/esm2015/index.js +9 -9
- package/dist/esm2015/inputs/adapter.js +242 -232
- package/dist/esm2015/inputs/adapter.js.map +1 -1
- package/dist/esm2015/inputs/common.js +11 -11
- package/dist/esm2015/inputs/datasource.js +20 -20
- package/dist/esm2015/inputs/index.js +7 -7
- package/dist/esm2015/inputs/settings.js +146 -146
- package/dist/esm2015/inputs/validation.js +371 -374
- package/dist/esm2015/inputs/validation.js.map +1 -1
- package/dist/esm2015/inputs/workflow.js +30 -30
- package/dist/esm2015/interfaces/adapter.js +1 -1
- package/dist/esm2015/interfaces/adapter.js.map +1 -1
- package/dist/esm2015/interfaces/datasource.js +1 -1
- package/dist/esm2015/interfaces/index.js +1 -1
- package/dist/esm2015/interfaces/item.js +1 -1
- package/dist/esm2015/interfaces/process.js +1 -1
- package/dist/esm2015/interfaces/process.js.map +1 -1
- package/dist/esm2015/interfaces/routines.js +1 -1
- package/dist/esm2015/interfaces/settings.js +1 -1
- package/dist/esm2015/interfaces/state.js +1 -1
- package/dist/esm2015/interfaces/validation.js +1 -1
- package/dist/esm2015/interfaces/workflow.js +1 -1
- package/dist/esm2015/processes/adapter/append.js +36 -35
- package/dist/esm2015/processes/adapter/append.js.map +1 -1
- package/dist/esm2015/processes/adapter/check.js +32 -32
- package/dist/esm2015/processes/adapter/check.js.map +1 -1
- package/dist/esm2015/processes/adapter/clip.js +12 -12
- package/dist/esm2015/processes/adapter/fix.js +77 -77
- package/dist/esm2015/processes/adapter/fix.js.map +1 -1
- package/dist/esm2015/processes/adapter/insert.js +73 -73
- package/dist/esm2015/processes/adapter/insert.js.map +1 -1
- package/dist/esm2015/processes/adapter/pause.js +22 -22
- package/dist/esm2015/processes/adapter/pause.js.map +1 -1
- package/dist/esm2015/processes/adapter/reload.js +19 -19
- package/dist/esm2015/processes/adapter/reload.js.map +1 -1
- package/dist/esm2015/processes/adapter/remove.js +102 -102
- package/dist/esm2015/processes/adapter/remove.js.map +1 -1
- package/dist/esm2015/processes/adapter/replace.js +39 -39
- package/dist/esm2015/processes/adapter/replace.js.map +1 -1
- package/dist/esm2015/processes/adapter/reset.js +35 -35
- package/dist/esm2015/processes/adapter/reset.js.map +1 -1
- package/dist/esm2015/processes/adapter/update.js +43 -43
- package/dist/esm2015/processes/adapter/update.js.map +1 -1
- package/dist/esm2015/processes/adjust.js +141 -141
- package/dist/esm2015/processes/adjust.js.map +1 -1
- package/dist/esm2015/processes/clip.js +49 -49
- package/dist/esm2015/processes/clip.js.map +1 -1
- package/dist/esm2015/processes/end.js +52 -52
- package/dist/esm2015/processes/end.js.map +1 -1
- package/dist/esm2015/processes/fetch.js +91 -91
- package/dist/esm2015/processes/fetch.js.map +1 -1
- package/dist/esm2015/processes/index.js +24 -24
- package/dist/esm2015/processes/init.js +14 -14
- package/dist/esm2015/processes/misc/base.js +30 -30
- package/dist/esm2015/processes/misc/base.js.map +1 -1
- package/dist/esm2015/processes/misc/enums.js +36 -36
- package/dist/esm2015/processes/misc/index.js +2 -2
- package/dist/esm2015/processes/postFetch.js +65 -65
- package/dist/esm2015/processes/postFetch.js.map +1 -1
- package/dist/esm2015/processes/preClip.js +85 -85
- package/dist/esm2015/processes/preClip.js.map +1 -1
- package/dist/esm2015/processes/preFetch.js +240 -240
- package/dist/esm2015/processes/preFetch.js.map +1 -1
- package/dist/esm2015/processes/render.js +54 -54
- package/dist/esm2015/processes/render.js.map +1 -1
- package/dist/esm2015/processes/scroll.js +97 -97
- package/dist/esm2015/processes/scroll.js.map +1 -1
- package/dist/esm2015/processes/start.js +11 -11
- package/dist/esm2015/scroller.js +86 -86
- package/dist/esm2015/scroller.js.map +1 -1
- package/dist/esm2015/version.js +4 -4
- package/dist/esm2015/version.js.map +1 -1
- package/dist/esm2015/workflow-transducer.js +218 -218
- package/dist/esm2015/workflow-transducer.js.map +1 -1
- package/dist/esm2015/workflow.js +174 -174
- package/dist/esm2015/workflow.js.map +1 -1
- package/dist/esm5/classes/adapter/context.js +50 -50
- package/dist/esm5/classes/adapter/context.js.map +1 -1
- package/dist/esm5/classes/adapter/props.js +300 -300
- package/dist/esm5/classes/adapter/wanted.js +29 -29
- package/dist/esm5/classes/adapter/wanted.js.map +1 -1
- package/dist/esm5/classes/adapter.js +535 -535
- package/dist/esm5/classes/adapter.js.map +1 -1
- package/dist/esm5/classes/buffer/cache.js +260 -260
- package/dist/esm5/classes/buffer/cache.js.map +1 -1
- package/dist/esm5/classes/buffer/checkCall.js +56 -56
- package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
- package/dist/esm5/classes/buffer/defaultSize.js +145 -145
- package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
- package/dist/esm5/classes/buffer.js +409 -409
- package/dist/esm5/classes/buffer.js.map +1 -1
- package/dist/esm5/classes/datasource.js +30 -31
- package/dist/esm5/classes/datasource.js.map +1 -1
- package/dist/esm5/classes/domRoutines.js +165 -165
- package/dist/esm5/classes/domRoutines.js.map +1 -1
- package/dist/esm5/classes/item.js +76 -76
- package/dist/esm5/classes/item.js.map +1 -1
- package/dist/esm5/classes/logger.js +210 -210
- package/dist/esm5/classes/logger.js.map +1 -1
- package/dist/esm5/classes/paddings.js +80 -80
- package/dist/esm5/classes/paddings.js.map +1 -1
- package/dist/esm5/classes/reactive.js +69 -69
- package/dist/esm5/classes/reactive.js.map +1 -1
- package/dist/esm5/classes/settings.js +47 -47
- package/dist/esm5/classes/settings.js.map +1 -1
- package/dist/esm5/classes/state/clip.js +22 -22
- package/dist/esm5/classes/state/clip.js.map +1 -1
- package/dist/esm5/classes/state/cycle.js +75 -75
- package/dist/esm5/classes/state/cycle.js.map +1 -1
- package/dist/esm5/classes/state/fetch.js +148 -148
- package/dist/esm5/classes/state/fetch.js.map +1 -1
- package/dist/esm5/classes/state/render.js +20 -20
- package/dist/esm5/classes/state/scroll.js +32 -32
- package/dist/esm5/classes/state/scroll.js.map +1 -1
- package/dist/esm5/classes/state.js +69 -69
- package/dist/esm5/classes/state.js.map +1 -1
- package/dist/esm5/classes/viewport.js +79 -79
- package/dist/esm5/classes/viewport.js.map +1 -1
- package/dist/esm5/index.js +9 -9
- package/dist/esm5/inputs/adapter.js +243 -233
- package/dist/esm5/inputs/adapter.js.map +1 -1
- package/dist/esm5/inputs/common.js +11 -11
- package/dist/esm5/inputs/datasource.js +21 -21
- package/dist/esm5/inputs/index.js +7 -7
- package/dist/esm5/inputs/settings.js +147 -147
- package/dist/esm5/inputs/validation.js +393 -396
- package/dist/esm5/inputs/validation.js.map +1 -1
- package/dist/esm5/inputs/workflow.js +31 -31
- package/dist/esm5/interfaces/adapter.js +1 -1
- package/dist/esm5/interfaces/adapter.js.map +1 -1
- package/dist/esm5/interfaces/datasource.js +1 -1
- package/dist/esm5/interfaces/index.js +1 -1
- package/dist/esm5/interfaces/item.js +1 -1
- package/dist/esm5/interfaces/process.js +1 -1
- package/dist/esm5/interfaces/process.js.map +1 -1
- package/dist/esm5/interfaces/routines.js +1 -1
- package/dist/esm5/interfaces/settings.js +1 -1
- package/dist/esm5/interfaces/state.js +1 -1
- package/dist/esm5/interfaces/validation.js +1 -1
- package/dist/esm5/interfaces/workflow.js +1 -1
- package/dist/esm5/processes/adapter/append.js +44 -43
- package/dist/esm5/processes/adapter/append.js.map +1 -1
- package/dist/esm5/processes/adapter/check.js +39 -39
- package/dist/esm5/processes/adapter/check.js.map +1 -1
- package/dist/esm5/processes/adapter/clip.js +19 -19
- package/dist/esm5/processes/adapter/fix.js +89 -89
- package/dist/esm5/processes/adapter/fix.js.map +1 -1
- package/dist/esm5/processes/adapter/insert.js +81 -81
- package/dist/esm5/processes/adapter/insert.js.map +1 -1
- package/dist/esm5/processes/adapter/pause.js +29 -29
- package/dist/esm5/processes/adapter/pause.js.map +1 -1
- package/dist/esm5/processes/adapter/reload.js +26 -26
- package/dist/esm5/processes/adapter/reload.js.map +1 -1
- package/dist/esm5/processes/adapter/remove.js +115 -115
- package/dist/esm5/processes/adapter/remove.js.map +1 -1
- package/dist/esm5/processes/adapter/replace.js +47 -47
- package/dist/esm5/processes/adapter/replace.js.map +1 -1
- package/dist/esm5/processes/adapter/reset.js +42 -42
- package/dist/esm5/processes/adapter/reset.js.map +1 -1
- package/dist/esm5/processes/adapter/update.js +59 -59
- package/dist/esm5/processes/adapter/update.js.map +1 -1
- package/dist/esm5/processes/adjust.js +152 -152
- package/dist/esm5/processes/adjust.js.map +1 -1
- package/dist/esm5/processes/clip.js +60 -60
- package/dist/esm5/processes/clip.js.map +1 -1
- package/dist/esm5/processes/end.js +63 -63
- package/dist/esm5/processes/end.js.map +1 -1
- package/dist/esm5/processes/fetch.js +102 -102
- package/dist/esm5/processes/fetch.js.map +1 -1
- package/dist/esm5/processes/index.js +24 -24
- package/dist/esm5/processes/init.js +21 -21
- package/dist/esm5/processes/misc/base.js +44 -44
- package/dist/esm5/processes/misc/base.js.map +1 -1
- package/dist/esm5/processes/misc/enums.js +36 -36
- package/dist/esm5/processes/misc/index.js +2 -2
- package/dist/esm5/processes/postFetch.js +74 -74
- package/dist/esm5/processes/postFetch.js.map +1 -1
- package/dist/esm5/processes/preClip.js +94 -94
- package/dist/esm5/processes/preClip.js.map +1 -1
- package/dist/esm5/processes/preFetch.js +247 -247
- package/dist/esm5/processes/preFetch.js.map +1 -1
- package/dist/esm5/processes/render.js +63 -63
- package/dist/esm5/processes/render.js.map +1 -1
- package/dist/esm5/processes/scroll.js +107 -107
- package/dist/esm5/processes/scroll.js.map +1 -1
- package/dist/esm5/processes/start.js +18 -18
- package/dist/esm5/scroller.js +100 -100
- package/dist/esm5/scroller.js.map +1 -1
- package/dist/esm5/version.js +4 -4
- package/dist/esm5/version.js.map +1 -1
- package/dist/esm5/workflow-transducer.js +220 -220
- package/dist/esm5/workflow-transducer.js.map +1 -1
- package/dist/esm5/workflow.js +198 -198
- package/dist/esm5/workflow.js.map +1 -1
- package/dist/typings/classes/adapter/context.d.ts +4 -4
- package/dist/typings/classes/adapter/props.d.ts +52 -52
- package/dist/typings/classes/adapter/wanted.d.ts +14 -14
- package/dist/typings/classes/adapter.d.ts +79 -79
- package/dist/typings/classes/buffer/cache.d.ts +95 -95
- package/dist/typings/classes/buffer/checkCall.d.ts +12 -12
- package/dist/typings/classes/buffer/defaultSize.d.ts +32 -32
- package/dist/typings/classes/buffer.d.ts +64 -64
- package/dist/typings/classes/datasource.d.ts +11 -11
- package/dist/typings/classes/domRoutines.d.ts +36 -36
- package/dist/typings/classes/item.d.ts +28 -28
- package/dist/typings/classes/logger.d.ts +28 -28
- package/dist/typings/classes/paddings.d.ts +22 -22
- package/dist/typings/classes/reactive.d.ts +21 -21
- package/dist/typings/classes/settings.d.ts +119 -119
- package/dist/typings/classes/state/clip.d.ts +9 -9
- package/dist/typings/classes/state/cycle.d.ts +29 -29
- package/dist/typings/classes/state/fetch.d.ts +62 -62
- package/dist/typings/classes/state/render.d.ts +9 -9
- package/dist/typings/classes/state/scroll.d.ts +16 -16
- package/dist/typings/classes/state.d.ts +29 -29
- package/dist/typings/classes/viewport.d.ts +32 -32
- package/dist/typings/index.d.ts +10 -10
- package/dist/typings/inputs/adapter.d.ts +5 -5
- package/dist/typings/inputs/common.d.ts +9 -9
- package/dist/typings/inputs/datasource.d.ts +7 -7
- package/dist/typings/inputs/index.d.ts +7 -7
- package/dist/typings/inputs/settings.d.ts +41 -41
- package/dist/typings/inputs/validation.d.ts +82 -83
- package/dist/typings/inputs/workflow.d.ts +9 -9
- package/dist/typings/interfaces/adapter.d.ts +164 -161
- package/dist/typings/interfaces/datasource.d.ts +28 -28
- package/dist/typings/interfaces/index.d.ts +10 -10
- package/dist/typings/interfaces/item.d.ts +8 -8
- package/dist/typings/interfaces/process.d.ts +35 -35
- package/dist/typings/interfaces/routines.d.ts +166 -166
- package/dist/typings/interfaces/settings.d.ts +31 -31
- package/dist/typings/interfaces/state.d.ts +24 -24
- package/dist/typings/interfaces/validation.d.ts +33 -33
- package/dist/typings/interfaces/workflow.d.ts +53 -53
- package/dist/typings/processes/adapter/append.d.ts +14 -14
- package/dist/typings/processes/adapter/check.d.ts +6 -6
- package/dist/typings/processes/adapter/clip.d.ts +7 -7
- package/dist/typings/processes/adapter/fix.d.ts +13 -13
- package/dist/typings/processes/adapter/insert.d.ts +11 -11
- package/dist/typings/processes/adapter/pause.d.ts +8 -8
- package/dist/typings/processes/adapter/reload.d.ts +6 -6
- package/dist/typings/processes/adapter/remove.d.ts +11 -11
- package/dist/typings/processes/adapter/replace.d.ts +8 -8
- package/dist/typings/processes/adapter/reset.d.ts +7 -7
- package/dist/typings/processes/adapter/update.d.ts +8 -8
- package/dist/typings/processes/adjust.d.ts +10 -10
- package/dist/typings/processes/clip.d.ts +7 -7
- package/dist/typings/processes/end.d.ts +10 -10
- package/dist/typings/processes/fetch.d.ts +18 -18
- package/dist/typings/processes/index.d.ts +24 -24
- package/dist/typings/processes/init.d.ts +7 -7
- package/dist/typings/processes/misc/base.d.ts +4 -4
- package/dist/typings/processes/misc/enums.d.ts +33 -33
- package/dist/typings/processes/misc/index.d.ts +2 -2
- package/dist/typings/processes/postFetch.d.ts +8 -8
- package/dist/typings/processes/preClip.d.ts +12 -12
- package/dist/typings/processes/preFetch.d.ts +17 -17
- package/dist/typings/processes/render.d.ts +9 -9
- package/dist/typings/processes/scroll.d.ts +13 -13
- package/dist/typings/processes/start.d.ts +6 -6
- package/dist/typings/scroller.d.ts +26 -26
- package/dist/typings/version.d.ts +5 -5
- package/dist/typings/workflow-transducer.d.ts +2 -2
- package/dist/typings/workflow.d.ts +29 -29
- package/package.json +19 -18
|
@@ -1,247 +1,247 @@
|
|
|
1
|
-
import { DefaultSize } from './defaultSize';
|
|
2
|
-
import { Direction } from '../../inputs/index';
|
|
3
|
-
export class ItemCache {
|
|
4
|
-
constructor(item, saveData) {
|
|
5
|
-
this.$index = item.$index;
|
|
6
|
-
this.data = saveData ? item.data : null;
|
|
7
|
-
this.size = item.size;
|
|
8
|
-
}
|
|
9
|
-
changeIndex(value) {
|
|
10
|
-
this.$index = value;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
export class Cache {
|
|
14
|
-
constructor({ itemSize, cacheData, cacheOnReload, sizeStrategy }, logger) {
|
|
15
|
-
this.itemSize = itemSize;
|
|
16
|
-
this.saveData = cacheData;
|
|
17
|
-
this.cacheOnReload = cacheOnReload;
|
|
18
|
-
this.sizeStrategy = sizeStrategy;
|
|
19
|
-
this.logger = logger;
|
|
20
|
-
this.items = new Map();
|
|
21
|
-
this.defaultSize = new DefaultSize(itemSize, sizeStrategy);
|
|
22
|
-
this.reset(true);
|
|
23
|
-
}
|
|
24
|
-
reset(force) {
|
|
25
|
-
force = force || !this.cacheOnReload;
|
|
26
|
-
if (force) {
|
|
27
|
-
this.minIndex = +Infinity;
|
|
28
|
-
this.maxIndex = -Infinity;
|
|
29
|
-
this.items.clear();
|
|
30
|
-
}
|
|
31
|
-
this.defaultSize.reset(force);
|
|
32
|
-
}
|
|
33
|
-
get size() {
|
|
34
|
-
return this.items.size;
|
|
35
|
-
}
|
|
36
|
-
get(index) {
|
|
37
|
-
return this.items.get(index);
|
|
38
|
-
}
|
|
39
|
-
getSizeByIndex(index) {
|
|
40
|
-
const item = this.get(index);
|
|
41
|
-
return item && item.size || this.defaultSize.get();
|
|
42
|
-
}
|
|
43
|
-
getDefaultSize() {
|
|
44
|
-
return this.defaultSize.get();
|
|
45
|
-
}
|
|
46
|
-
recalculateDefaultSize() {
|
|
47
|
-
if (this.defaultSize.recalculate(this.size)) {
|
|
48
|
-
this.logger.log(() => `default size has been updated: ${this.defaultSize.get()}`);
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Adds item to Set by $index, replaces existed item if $index matches.
|
|
55
|
-
* Maintains min/max indexes and default item size.
|
|
56
|
-
*
|
|
57
|
-
* @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.
|
|
58
|
-
*
|
|
59
|
-
* @returns {ItemCache<Data>} Cached item.
|
|
60
|
-
*/
|
|
61
|
-
add(item) {
|
|
62
|
-
let itemCache = this.get(item.$index);
|
|
63
|
-
if (itemCache) { // adding item is already cached
|
|
64
|
-
if (this.saveData) {
|
|
65
|
-
itemCache.data = item.data;
|
|
66
|
-
}
|
|
67
|
-
if (itemCache.size !== item.size) {
|
|
68
|
-
if (itemCache.size) {
|
|
69
|
-
this.defaultSize.setExisted(itemCache.size, item.size);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
this.defaultSize.setNew(item.size);
|
|
73
|
-
}
|
|
74
|
-
itemCache.size = item.size;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
itemCache = new ItemCache(item, this.saveData);
|
|
79
|
-
this.items.set(item.$index, itemCache);
|
|
80
|
-
this.defaultSize.setNew(item.size);
|
|
81
|
-
}
|
|
82
|
-
if (item.$index < this.minIndex) {
|
|
83
|
-
this.minIndex = item.$index;
|
|
84
|
-
}
|
|
85
|
-
if (item.$index > this.maxIndex) {
|
|
86
|
-
this.maxIndex = item.$index;
|
|
87
|
-
}
|
|
88
|
-
return itemCache;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Inserts items to Set, shifts $indexes of items that remain.
|
|
92
|
-
* Replaces current Set with a new one with new regular $indexes.
|
|
93
|
-
* Maintains min/max indexes.
|
|
94
|
-
*
|
|
95
|
-
* @param {Data[]} toInsert List of non-indexed items to be inserted.
|
|
96
|
-
* @param {number} index The index before/after which the insertion is performed.
|
|
97
|
-
* @param {Direction} direction Determines the direction of insertion.
|
|
98
|
-
* @param {boolean} fixRight Defines indexes shifting strategy.
|
|
99
|
-
* If false, indexes that are greater than the inserted ones are increased.
|
|
100
|
-
* If true, indexes that are less than than the inserted ones are decreased.
|
|
101
|
-
*/
|
|
102
|
-
insertItems(toInsert, index, direction, fixRight) {
|
|
103
|
-
const items = new Map();
|
|
104
|
-
const length = toInsert.length;
|
|
105
|
-
let min = Infinity, max = -Infinity;
|
|
106
|
-
const set = (item) => {
|
|
107
|
-
items.set(item.$index, item);
|
|
108
|
-
min = item.$index < min ? item.$index : min;
|
|
109
|
-
max = item.$index > max ? item.$index : max;
|
|
110
|
-
};
|
|
111
|
-
this.items.forEach(item => {
|
|
112
|
-
let shift = 0;
|
|
113
|
-
if (direction === Direction.backward) {
|
|
114
|
-
if (item.$index < index && fixRight) {
|
|
115
|
-
shift = -length;
|
|
116
|
-
}
|
|
117
|
-
else if (item.$index >= index && !fixRight) {
|
|
118
|
-
shift = length;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
else if (direction === Direction.forward) {
|
|
122
|
-
if (item.$index <= index && fixRight) {
|
|
123
|
-
shift = -length;
|
|
124
|
-
}
|
|
125
|
-
else if (item.$index > index && !fixRight) {
|
|
126
|
-
shift = length;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (shift) {
|
|
130
|
-
item.changeIndex(item.$index + shift);
|
|
131
|
-
}
|
|
132
|
-
set(item);
|
|
133
|
-
});
|
|
134
|
-
if (this.saveData) { // persist data with no sizes
|
|
135
|
-
toInsert.forEach((data, i) => {
|
|
136
|
-
const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);
|
|
137
|
-
const item = new ItemCache({ $index, data }, this.saveData);
|
|
138
|
-
set(item);
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
this.items = items;
|
|
142
|
-
this.minIndex = min;
|
|
143
|
-
this.maxIndex = max;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Removes items from Set, shifts $indexes of items that remain.
|
|
147
|
-
* Replaces current Set with a new one with new regular $indexes.
|
|
148
|
-
* Maintains min/max indexes and default item size.
|
|
149
|
-
*
|
|
150
|
-
* @param {number[]} toRemove List of indexes to be removed.
|
|
151
|
-
* @param {boolean} fixRight Defines indexes shifting strategy.
|
|
152
|
-
* If false, indexes that are greater than the removed ones will be decreased.
|
|
153
|
-
* If true, indexes that are less than than the removed ones will be increased.
|
|
154
|
-
*/
|
|
155
|
-
removeItems(toRemove, fixRight) {
|
|
156
|
-
const items = new Map();
|
|
157
|
-
let min = Infinity, max = -Infinity;
|
|
158
|
-
this.items.forEach(item => {
|
|
159
|
-
if (toRemove.some(index => index === item.$index)) {
|
|
160
|
-
if (item.size) {
|
|
161
|
-
this.defaultSize.setRemoved(item.size);
|
|
162
|
-
}
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
const diff = fixRight
|
|
166
|
-
? toRemove.reduce((acc, index) => acc + (item.$index < index ? 1 : 0), 0)
|
|
167
|
-
: toRemove.reduce((acc, index) => acc - (item.$index > index ? 1 : 0), 0);
|
|
168
|
-
item.changeIndex(item.$index + diff);
|
|
169
|
-
items.set(item.$index, item);
|
|
170
|
-
min = item.$index < min ? item.$index : min;
|
|
171
|
-
max = item.$index > max ? item.$index : max;
|
|
172
|
-
});
|
|
173
|
-
this.items = items;
|
|
174
|
-
this.minIndex = min;
|
|
175
|
-
this.maxIndex = max;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Destructively updates Set based on subset (before-after) changes.
|
|
179
|
-
* Replaces current Set with a new one with new regular $indexes.
|
|
180
|
-
* Maintains min/max indexes. Maintains default item size on remove only.
|
|
181
|
-
*
|
|
182
|
-
* @param {ItemUpdate[]} before Initial subset of items to be replaced by "after".
|
|
183
|
-
* Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.
|
|
184
|
-
* Items to be removed must have toRemove flag: before[].toRemove = true.
|
|
185
|
-
* @param {Item<Data>[]} after Transformed subset that replaces "before". Must be $index-incremental.
|
|
186
|
-
* Must contain at least 1 $index from "before" or be empty.
|
|
187
|
-
* @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if "after" is empty.
|
|
188
|
-
*/
|
|
189
|
-
updateSubset(before, after, fixRight) {
|
|
190
|
-
if (!this.size || !before.length) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
const minB = before[0].$index, maxB = before[before.length - 1].$index;
|
|
194
|
-
let leftDiff, rightDiff;
|
|
195
|
-
if (after.length) {
|
|
196
|
-
const minA = after[0].$index, maxA = after[after.length - 1].$index;
|
|
197
|
-
leftDiff = minA - minB;
|
|
198
|
-
rightDiff = maxA - maxB;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
leftDiff = fixRight ? maxB - minB + 1 : 0;
|
|
202
|
-
rightDiff = fixRight ? 0 : minB - maxB - 1;
|
|
203
|
-
}
|
|
204
|
-
const items = new Map();
|
|
205
|
-
this.items.forEach(item => {
|
|
206
|
-
if (item.$index < minB) { // items to the left of the subset
|
|
207
|
-
item.changeIndex(item.$index + leftDiff);
|
|
208
|
-
items.set(item.$index, item);
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
else if (item.$index > maxB) { // items to the right of the subset
|
|
212
|
-
item.changeIndex(item.$index + rightDiff);
|
|
213
|
-
items.set(item.$index, item);
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
after.forEach(item => // subset items
|
|
218
|
-
items.set(item.$index, new ItemCache(item, this.saveData)));
|
|
219
|
-
before // to maintain default size on remove
|
|
220
|
-
.filter(item => item.toRemove)
|
|
221
|
-
.forEach(item => this.defaultSize.setRemoved(item.size));
|
|
222
|
-
this.minIndex += leftDiff;
|
|
223
|
-
this.maxIndex += rightDiff;
|
|
224
|
-
this.items = items;
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Shifts all indexes by some value.
|
|
228
|
-
* Replaces current Set with a new one with new regular $indexes.
|
|
229
|
-
* Maintains min/max indexes.
|
|
230
|
-
*
|
|
231
|
-
* @param {number} delta A shift value.
|
|
232
|
-
*/
|
|
233
|
-
shiftIndexes(delta) {
|
|
234
|
-
const items = new Map();
|
|
235
|
-
let min = Infinity, max = -Infinity;
|
|
236
|
-
this.items.forEach(item => {
|
|
237
|
-
item.changeIndex(item.$index + delta);
|
|
238
|
-
items.set(item.$index, item);
|
|
239
|
-
min = item.$index < min ? item.$index : min;
|
|
240
|
-
max = item.$index > max ? item.$index : max;
|
|
241
|
-
});
|
|
242
|
-
this.items = items;
|
|
243
|
-
this.minIndex = min;
|
|
244
|
-
this.maxIndex = max;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
1
|
+
import { DefaultSize } from './defaultSize';
|
|
2
|
+
import { Direction } from '../../inputs/index';
|
|
3
|
+
export class ItemCache {
|
|
4
|
+
constructor(item, saveData) {
|
|
5
|
+
this.$index = item.$index;
|
|
6
|
+
this.data = saveData ? item.data : null;
|
|
7
|
+
this.size = item.size;
|
|
8
|
+
}
|
|
9
|
+
changeIndex(value) {
|
|
10
|
+
this.$index = value;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class Cache {
|
|
14
|
+
constructor({ itemSize, cacheData, cacheOnReload, sizeStrategy }, logger) {
|
|
15
|
+
this.itemSize = itemSize;
|
|
16
|
+
this.saveData = cacheData;
|
|
17
|
+
this.cacheOnReload = cacheOnReload;
|
|
18
|
+
this.sizeStrategy = sizeStrategy;
|
|
19
|
+
this.logger = logger;
|
|
20
|
+
this.items = new Map();
|
|
21
|
+
this.defaultSize = new DefaultSize(itemSize, sizeStrategy);
|
|
22
|
+
this.reset(true);
|
|
23
|
+
}
|
|
24
|
+
reset(force) {
|
|
25
|
+
force = force || !this.cacheOnReload;
|
|
26
|
+
if (force) {
|
|
27
|
+
this.minIndex = +Infinity;
|
|
28
|
+
this.maxIndex = -Infinity;
|
|
29
|
+
this.items.clear();
|
|
30
|
+
}
|
|
31
|
+
this.defaultSize.reset(force);
|
|
32
|
+
}
|
|
33
|
+
get size() {
|
|
34
|
+
return this.items.size;
|
|
35
|
+
}
|
|
36
|
+
get(index) {
|
|
37
|
+
return this.items.get(index);
|
|
38
|
+
}
|
|
39
|
+
getSizeByIndex(index) {
|
|
40
|
+
const item = this.get(index);
|
|
41
|
+
return item && item.size || this.defaultSize.get();
|
|
42
|
+
}
|
|
43
|
+
getDefaultSize() {
|
|
44
|
+
return this.defaultSize.get();
|
|
45
|
+
}
|
|
46
|
+
recalculateDefaultSize() {
|
|
47
|
+
if (this.defaultSize.recalculate(this.size)) {
|
|
48
|
+
this.logger.log(() => `default size has been updated: ${this.defaultSize.get()}`);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Adds item to Set by $index, replaces existed item if $index matches.
|
|
55
|
+
* Maintains min/max indexes and default item size.
|
|
56
|
+
*
|
|
57
|
+
* @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.
|
|
58
|
+
*
|
|
59
|
+
* @returns {ItemCache<Data>} Cached item.
|
|
60
|
+
*/
|
|
61
|
+
add(item) {
|
|
62
|
+
let itemCache = this.get(item.$index);
|
|
63
|
+
if (itemCache) { // adding item is already cached
|
|
64
|
+
if (this.saveData) {
|
|
65
|
+
itemCache.data = item.data;
|
|
66
|
+
}
|
|
67
|
+
if (itemCache.size !== item.size) {
|
|
68
|
+
if (itemCache.size) {
|
|
69
|
+
this.defaultSize.setExisted(itemCache.size, item.size);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this.defaultSize.setNew(item.size);
|
|
73
|
+
}
|
|
74
|
+
itemCache.size = item.size;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
itemCache = new ItemCache(item, this.saveData);
|
|
79
|
+
this.items.set(item.$index, itemCache);
|
|
80
|
+
this.defaultSize.setNew(item.size);
|
|
81
|
+
}
|
|
82
|
+
if (item.$index < this.minIndex) {
|
|
83
|
+
this.minIndex = item.$index;
|
|
84
|
+
}
|
|
85
|
+
if (item.$index > this.maxIndex) {
|
|
86
|
+
this.maxIndex = item.$index;
|
|
87
|
+
}
|
|
88
|
+
return itemCache;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Inserts items to Set, shifts $indexes of items that remain.
|
|
92
|
+
* Replaces current Set with a new one with new regular $indexes.
|
|
93
|
+
* Maintains min/max indexes.
|
|
94
|
+
*
|
|
95
|
+
* @param {Data[]} toInsert List of non-indexed items to be inserted.
|
|
96
|
+
* @param {number} index The index before/after which the insertion is performed.
|
|
97
|
+
* @param {Direction} direction Determines the direction of insertion.
|
|
98
|
+
* @param {boolean} fixRight Defines indexes shifting strategy.
|
|
99
|
+
* If false, indexes that are greater than the inserted ones are increased.
|
|
100
|
+
* If true, indexes that are less than than the inserted ones are decreased.
|
|
101
|
+
*/
|
|
102
|
+
insertItems(toInsert, index, direction, fixRight) {
|
|
103
|
+
const items = new Map();
|
|
104
|
+
const length = toInsert.length;
|
|
105
|
+
let min = Infinity, max = -Infinity;
|
|
106
|
+
const set = (item) => {
|
|
107
|
+
items.set(item.$index, item);
|
|
108
|
+
min = item.$index < min ? item.$index : min;
|
|
109
|
+
max = item.$index > max ? item.$index : max;
|
|
110
|
+
};
|
|
111
|
+
this.items.forEach(item => {
|
|
112
|
+
let shift = 0;
|
|
113
|
+
if (direction === Direction.backward) {
|
|
114
|
+
if (item.$index < index && fixRight) {
|
|
115
|
+
shift = -length;
|
|
116
|
+
}
|
|
117
|
+
else if (item.$index >= index && !fixRight) {
|
|
118
|
+
shift = length;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (direction === Direction.forward) {
|
|
122
|
+
if (item.$index <= index && fixRight) {
|
|
123
|
+
shift = -length;
|
|
124
|
+
}
|
|
125
|
+
else if (item.$index > index && !fixRight) {
|
|
126
|
+
shift = length;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (shift) {
|
|
130
|
+
item.changeIndex(item.$index + shift);
|
|
131
|
+
}
|
|
132
|
+
set(item);
|
|
133
|
+
});
|
|
134
|
+
if (this.saveData) { // persist data with no sizes
|
|
135
|
+
toInsert.forEach((data, i) => {
|
|
136
|
+
const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);
|
|
137
|
+
const item = new ItemCache({ $index, data }, this.saveData);
|
|
138
|
+
set(item);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
this.items = items;
|
|
142
|
+
this.minIndex = min;
|
|
143
|
+
this.maxIndex = max;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Removes items from Set, shifts $indexes of items that remain.
|
|
147
|
+
* Replaces current Set with a new one with new regular $indexes.
|
|
148
|
+
* Maintains min/max indexes and default item size.
|
|
149
|
+
*
|
|
150
|
+
* @param {number[]} toRemove List of indexes to be removed.
|
|
151
|
+
* @param {boolean} fixRight Defines indexes shifting strategy.
|
|
152
|
+
* If false, indexes that are greater than the removed ones will be decreased.
|
|
153
|
+
* If true, indexes that are less than than the removed ones will be increased.
|
|
154
|
+
*/
|
|
155
|
+
removeItems(toRemove, fixRight) {
|
|
156
|
+
const items = new Map();
|
|
157
|
+
let min = Infinity, max = -Infinity;
|
|
158
|
+
this.items.forEach(item => {
|
|
159
|
+
if (toRemove.some(index => index === item.$index)) {
|
|
160
|
+
if (item.size) {
|
|
161
|
+
this.defaultSize.setRemoved(item.size);
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const diff = fixRight
|
|
166
|
+
? toRemove.reduce((acc, index) => acc + (item.$index < index ? 1 : 0), 0)
|
|
167
|
+
: toRemove.reduce((acc, index) => acc - (item.$index > index ? 1 : 0), 0);
|
|
168
|
+
item.changeIndex(item.$index + diff);
|
|
169
|
+
items.set(item.$index, item);
|
|
170
|
+
min = item.$index < min ? item.$index : min;
|
|
171
|
+
max = item.$index > max ? item.$index : max;
|
|
172
|
+
});
|
|
173
|
+
this.items = items;
|
|
174
|
+
this.minIndex = min;
|
|
175
|
+
this.maxIndex = max;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Destructively updates Set based on subset (before-after) changes.
|
|
179
|
+
* Replaces current Set with a new one with new regular $indexes.
|
|
180
|
+
* Maintains min/max indexes. Maintains default item size on remove only.
|
|
181
|
+
*
|
|
182
|
+
* @param {ItemUpdate[]} before Initial subset of items to be replaced by "after".
|
|
183
|
+
* Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.
|
|
184
|
+
* Items to be removed must have toRemove flag: before[].toRemove = true.
|
|
185
|
+
* @param {Item<Data>[]} after Transformed subset that replaces "before". Must be $index-incremental.
|
|
186
|
+
* Must contain at least 1 $index from "before" or be empty.
|
|
187
|
+
* @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if "after" is empty.
|
|
188
|
+
*/
|
|
189
|
+
updateSubset(before, after, fixRight) {
|
|
190
|
+
if (!this.size || !before.length) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const minB = before[0].$index, maxB = before[before.length - 1].$index;
|
|
194
|
+
let leftDiff, rightDiff;
|
|
195
|
+
if (after.length) {
|
|
196
|
+
const minA = after[0].$index, maxA = after[after.length - 1].$index;
|
|
197
|
+
leftDiff = minA - minB;
|
|
198
|
+
rightDiff = maxA - maxB;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
leftDiff = fixRight ? maxB - minB + 1 : 0;
|
|
202
|
+
rightDiff = fixRight ? 0 : minB - maxB - 1;
|
|
203
|
+
}
|
|
204
|
+
const items = new Map();
|
|
205
|
+
this.items.forEach(item => {
|
|
206
|
+
if (item.$index < minB) { // items to the left of the subset
|
|
207
|
+
item.changeIndex(item.$index + leftDiff);
|
|
208
|
+
items.set(item.$index, item);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
else if (item.$index > maxB) { // items to the right of the subset
|
|
212
|
+
item.changeIndex(item.$index + rightDiff);
|
|
213
|
+
items.set(item.$index, item);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
after.forEach(item => // subset items
|
|
218
|
+
items.set(item.$index, new ItemCache(item, this.saveData)));
|
|
219
|
+
before // to maintain default size on remove
|
|
220
|
+
.filter(item => item.toRemove)
|
|
221
|
+
.forEach(item => this.defaultSize.setRemoved(item.size));
|
|
222
|
+
this.minIndex += leftDiff;
|
|
223
|
+
this.maxIndex += rightDiff;
|
|
224
|
+
this.items = items;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Shifts all indexes by some value.
|
|
228
|
+
* Replaces current Set with a new one with new regular $indexes.
|
|
229
|
+
* Maintains min/max indexes.
|
|
230
|
+
*
|
|
231
|
+
* @param {number} delta A shift value.
|
|
232
|
+
*/
|
|
233
|
+
shiftIndexes(delta) {
|
|
234
|
+
const items = new Map();
|
|
235
|
+
let min = Infinity, max = -Infinity;
|
|
236
|
+
this.items.forEach(item => {
|
|
237
|
+
item.changeIndex(item.$index + delta);
|
|
238
|
+
items.set(item.$index, item);
|
|
239
|
+
min = item.$index < min ? item.$index : min;
|
|
240
|
+
max = item.$index > max ? item.$index : max;
|
|
241
|
+
});
|
|
242
|
+
this.items = items;
|
|
243
|
+
this.minIndex = min;
|
|
244
|
+
this.maxIndex = max;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
247
|
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/classes/buffer/cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultSize } from './defaultSize';\r\nimport { Item } from '../item';\r\nimport { Settings } from '../settings';\r\nimport { Logger } from '../logger';\r\nimport { SizeStrategy, Direction } from '../../inputs/index';\r\n\r\ninterface ItemToCache<Data> {\r\n $index: number;\r\n data: Data;\r\n size?: number;\r\n}\r\n\r\ninterface ItemUpdate {\r\n $index: number;\r\n size: number;\r\n toRemove?: boolean;\r\n}\r\n\r\nexport class ItemCache<Data = unknown> {\r\n $index: number;\r\n data: Data | null;\r\n size?: number;\r\n position: number;\r\n\r\n constructor(item: ItemToCache<Data>, saveData: boolean) {\r\n this.$index = item.$index;\r\n this.data = saveData ? item.data : null;\r\n this.size = item.size;\r\n }\r\n\r\n changeIndex(value: number): void {\r\n this.$index = value;\r\n }\r\n}\r\n\r\nexport class Cache<Data = unknown> {\r\n minIndex: number;\r\n maxIndex: number;\r\n\r\n readonly itemSize: number;\r\n readonly saveData: boolean;\r\n readonly cacheOnReload: boolean;\r\n readonly sizeStrategy: SizeStrategy;\r\n readonly logger: Logger;\r\n private items: Map<number, ItemCache<Data>>;\r\n private defaultSize: DefaultSize;\r\n\r\n constructor({ itemSize, cacheData, cacheOnReload, sizeStrategy }: Settings, logger: Logger) {\r\n this.itemSize = itemSize;\r\n this.saveData = cacheData;\r\n this.cacheOnReload = cacheOnReload;\r\n this.sizeStrategy = sizeStrategy;\r\n this.logger = logger;\r\n this.items = new Map<number, ItemCache<Data>>();\r\n this.defaultSize = new DefaultSize(itemSize, sizeStrategy);\r\n this.reset(true);\r\n }\r\n\r\n reset(force: boolean): void {\r\n force = force || !this.cacheOnReload;\r\n if (force) {\r\n this.minIndex = +Infinity;\r\n this.maxIndex = -Infinity;\r\n this.items.clear();\r\n }\r\n this.defaultSize.reset(force);\r\n }\r\n\r\n get size(): number {\r\n return this.items.size;\r\n }\r\n\r\n get(index: number): ItemCache<Data> | undefined {\r\n return this.items.get(index);\r\n }\r\n\r\n getSizeByIndex(index: number): number {\r\n const item = this.get(index);\r\n return item && item.size || this.defaultSize.get();\r\n }\r\n\r\n getDefaultSize(): number {\r\n return this.defaultSize.get();\r\n }\r\n\r\n recalculateDefaultSize(): boolean {\r\n if (this.defaultSize.recalculate(this.size)) {\r\n this.logger.log(() => `default size has been updated: ${this.defaultSize.get()}`);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Adds item to Set by $index, replaces existed item if $index matches.\r\n * Maintains min/max indexes and default item size.\r\n *\r\n * @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.\r\n * \r\n * @returns {ItemCache<Data>} Cached item.\r\n */\r\n add(item: Item<Data>): ItemCache<Data> {\r\n let itemCache = this.get(item.$index);\r\n if (itemCache) { // adding item is already cached\r\n if (this.saveData) {\r\n itemCache.data = item.data;\r\n }\r\n if (itemCache.size !== item.size) {\r\n if (itemCache.size) {\r\n this.defaultSize.setExisted(itemCache.size, item.size);\r\n } else {\r\n this.defaultSize.setNew(item.size);\r\n }\r\n itemCache.size = item.size;\r\n }\r\n } else {\r\n itemCache = new ItemCache<Data>(item, this.saveData);\r\n this.items.set(item.$index, itemCache);\r\n this.defaultSize.setNew(item.size);\r\n }\r\n if (item.$index < this.minIndex) {\r\n this.minIndex = item.$index;\r\n }\r\n if (item.$index > this.maxIndex) {\r\n this.maxIndex = item.$index;\r\n }\r\n return itemCache;\r\n }\r\n\r\n /**\r\n * Inserts items to Set, shifts $indexes of items that remain.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes.\r\n *\r\n * @param {Data[]} toInsert List of non-indexed items to be inserted.\r\n * @param {number} index The index before/after which the insertion is performed.\r\n * @param {Direction} direction Determines the direction of insertion.\r\n * @param {boolean} fixRight Defines indexes shifting strategy.\r\n * If false, indexes that are greater than the inserted ones are increased.\r\n * If true, indexes that are less than than the inserted ones are decreased.\r\n */\r\n insertItems(toInsert: Data[], index: number, direction: Direction, fixRight: boolean): void {\r\n const items = new Map<number, ItemCache<Data>>();\r\n const length = toInsert.length;\r\n let min = Infinity, max = -Infinity;\r\n const set = (item: ItemCache<Data>) => {\r\n items.set(item.$index, item);\r\n min = item.$index < min ? item.$index : min;\r\n max = item.$index > max ? item.$index : max;\r\n };\r\n this.items.forEach(item => {\r\n let shift = 0;\r\n if (direction === Direction.backward) {\r\n if (item.$index < index && fixRight) {\r\n shift = -length;\r\n } else if (item.$index >= index && !fixRight) {\r\n shift = length;\r\n }\r\n } else if (direction === Direction.forward) {\r\n if (item.$index <= index && fixRight) {\r\n shift = -length;\r\n } else if (item.$index > index && !fixRight) {\r\n shift = length;\r\n }\r\n }\r\n if (shift) {\r\n item.changeIndex(item.$index + shift);\r\n }\r\n set(item);\r\n });\r\n if (this.saveData) { // persist data with no sizes\r\n toInsert.forEach((data, i) => {\r\n const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);\r\n const item = new ItemCache<Data>({ $index, data }, this.saveData);\r\n set(item);\r\n });\r\n }\r\n this.items = items;\r\n this.minIndex = min;\r\n this.maxIndex = max;\r\n }\r\n\r\n /**\r\n * Removes items from Set, shifts $indexes of items that remain.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes and default item size.\r\n *\r\n * @param {number[]} toRemove List of indexes to be removed.\r\n * @param {boolean} fixRight Defines indexes shifting strategy.\r\n * If false, indexes that are greater than the removed ones will be decreased.\r\n * If true, indexes that are less than than the removed ones will be increased.\r\n */\r\n removeItems(toRemove: number[], fixRight: boolean): void {\r\n const items = new Map<number, ItemCache<Data>>();\r\n let min = Infinity, max = -Infinity;\r\n this.items.forEach(item => {\r\n if (toRemove.some(index => index === item.$index)) {\r\n if (item.size) {\r\n this.defaultSize.setRemoved(item.size);\r\n }\r\n return;\r\n }\r\n const diff = fixRight\r\n ? toRemove.reduce((acc, index) => acc + (item.$index < index ? 1 : 0), 0)\r\n : toRemove.reduce((acc, index) => acc - (item.$index > index ? 1 : 0), 0);\r\n item.changeIndex(item.$index + diff);\r\n items.set(item.$index, item);\r\n min = item.$index < min ? item.$index : min;\r\n max = item.$index > max ? item.$index : max;\r\n });\r\n this.items = items;\r\n this.minIndex = min;\r\n this.maxIndex = max;\r\n }\r\n\r\n /**\r\n * Destructively updates Set based on subset (before-after) changes.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes. Maintains default item size on remove only.\r\n *\r\n * @param {ItemUpdate[]} before Initial subset of items to be replaced by \"after\".\r\n * Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.\r\n * Items to be removed must have toRemove flag: before[].toRemove = true.\r\n * @param {Item<Data>[]} after Transformed subset that replaces \"before\". Must be $index-incremental.\r\n * Must contain at least 1 $index from \"before\" or be empty.\r\n * @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if \"after\" is empty.\r\n */\r\n updateSubset(before: ItemUpdate[], after: Item<Data>[], fixRight?: boolean): void {\r\n if (!this.size || !before.length) {\r\n return;\r\n }\r\n const minB = before[0].$index, maxB = before[before.length - 1].$index;\r\n let leftDiff: number, rightDiff: number;\r\n if (after.length) {\r\n const minA = after[0].$index, maxA = after[after.length - 1].$index;\r\n leftDiff = minA - minB;\r\n rightDiff = maxA - maxB;\r\n } else {\r\n leftDiff = fixRight ? maxB - minB + 1 : 0;\r\n rightDiff = fixRight ? 0 : minB - maxB - 1;\r\n }\r\n const items = new Map<number, ItemCache<Data>>();\r\n this.items.forEach(item => {\r\n if (item.$index < minB) { // items to the left of the subset\r\n item.changeIndex(item.$index + leftDiff);\r\n items.set(item.$index, item);\r\n return;\r\n } else if (item.$index > maxB) { // items to the right of the subset\r\n item.changeIndex(item.$index + rightDiff);\r\n items.set(item.$index, item);\r\n return;\r\n }\r\n });\r\n after.forEach(item => // subset items\r\n items.set(item.$index, new ItemCache<Data>(item, this.saveData))\r\n );\r\n before // to maintain default size on remove\r\n .filter(item => item.toRemove)\r\n .forEach(item => this.defaultSize.setRemoved(item.size));\r\n this.minIndex += leftDiff;\r\n this.maxIndex += rightDiff;\r\n this.items = items;\r\n }\r\n\r\n /**\r\n * Shifts all indexes by some value.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes.\r\n *\r\n * @param {number} delta A shift value.\r\n */\r\n shiftIndexes(delta: number): void {\r\n const items = new Map<number, ItemCache<Data>>();\r\n let min = Infinity, max = -Infinity;\r\n this.items.forEach(item => {\r\n item.changeIndex(item.$index + delta);\r\n items.set(item.$index, item);\r\n min = item.$index < min ? item.$index : min;\r\n max = item.$index > max ? item.$index : max;\r\n });\r\n this.items = items;\r\n this.minIndex = min;\r\n this.maxIndex = max;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/classes/buffer/cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultSize } from './defaultSize';\r\nimport { Item } from '../item';\r\nimport { Settings } from '../settings';\r\nimport { Logger } from '../logger';\r\nimport { SizeStrategy, Direction } from '../../inputs/index';\r\n\r\ninterface ItemToCache<Data> {\r\n $index: number;\r\n data: Data;\r\n size?: number;\r\n}\r\n\r\ninterface ItemUpdate {\r\n $index: number;\r\n size: number;\r\n toRemove?: boolean;\r\n}\r\n\r\nexport class ItemCache<Data = unknown> {\r\n $index: number;\r\n data: Data | null;\r\n size?: number;\r\n position: number;\r\n\r\n constructor(item: ItemToCache<Data>, saveData: boolean) {\r\n this.$index = item.$index;\r\n this.data = saveData ? item.data : null;\r\n this.size = item.size;\r\n }\r\n\r\n changeIndex(value: number): void {\r\n this.$index = value;\r\n }\r\n}\r\n\r\nexport class Cache<Data = unknown> {\r\n minIndex: number;\r\n maxIndex: number;\r\n\r\n readonly itemSize: number;\r\n readonly saveData: boolean;\r\n readonly cacheOnReload: boolean;\r\n readonly sizeStrategy: SizeStrategy;\r\n readonly logger: Logger;\r\n private items: Map<number, ItemCache<Data>>;\r\n private defaultSize: DefaultSize;\r\n\r\n constructor({ itemSize, cacheData, cacheOnReload, sizeStrategy }: Settings, logger: Logger) {\r\n this.itemSize = itemSize;\r\n this.saveData = cacheData;\r\n this.cacheOnReload = cacheOnReload;\r\n this.sizeStrategy = sizeStrategy;\r\n this.logger = logger;\r\n this.items = new Map<number, ItemCache<Data>>();\r\n this.defaultSize = new DefaultSize(itemSize, sizeStrategy);\r\n this.reset(true);\r\n }\r\n\r\n reset(force: boolean): void {\r\n force = force || !this.cacheOnReload;\r\n if (force) {\r\n this.minIndex = +Infinity;\r\n this.maxIndex = -Infinity;\r\n this.items.clear();\r\n }\r\n this.defaultSize.reset(force);\r\n }\r\n\r\n get size(): number {\r\n return this.items.size;\r\n }\r\n\r\n get(index: number): ItemCache<Data> | undefined {\r\n return this.items.get(index);\r\n }\r\n\r\n getSizeByIndex(index: number): number {\r\n const item = this.get(index);\r\n return item && item.size || this.defaultSize.get();\r\n }\r\n\r\n getDefaultSize(): number {\r\n return this.defaultSize.get();\r\n }\r\n\r\n recalculateDefaultSize(): boolean {\r\n if (this.defaultSize.recalculate(this.size)) {\r\n this.logger.log(() => `default size has been updated: ${this.defaultSize.get()}`);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Adds item to Set by $index, replaces existed item if $index matches.\r\n * Maintains min/max indexes and default item size.\r\n *\r\n * @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.\r\n * \r\n * @returns {ItemCache<Data>} Cached item.\r\n */\r\n add(item: Item<Data>): ItemCache<Data> {\r\n let itemCache = this.get(item.$index);\r\n if (itemCache) { // adding item is already cached\r\n if (this.saveData) {\r\n itemCache.data = item.data;\r\n }\r\n if (itemCache.size !== item.size) {\r\n if (itemCache.size) {\r\n this.defaultSize.setExisted(itemCache.size, item.size);\r\n } else {\r\n this.defaultSize.setNew(item.size);\r\n }\r\n itemCache.size = item.size;\r\n }\r\n } else {\r\n itemCache = new ItemCache<Data>(item, this.saveData);\r\n this.items.set(item.$index, itemCache);\r\n this.defaultSize.setNew(item.size);\r\n }\r\n if (item.$index < this.minIndex) {\r\n this.minIndex = item.$index;\r\n }\r\n if (item.$index > this.maxIndex) {\r\n this.maxIndex = item.$index;\r\n }\r\n return itemCache;\r\n }\r\n\r\n /**\r\n * Inserts items to Set, shifts $indexes of items that remain.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes.\r\n *\r\n * @param {Data[]} toInsert List of non-indexed items to be inserted.\r\n * @param {number} index The index before/after which the insertion is performed.\r\n * @param {Direction} direction Determines the direction of insertion.\r\n * @param {boolean} fixRight Defines indexes shifting strategy.\r\n * If false, indexes that are greater than the inserted ones are increased.\r\n * If true, indexes that are less than than the inserted ones are decreased.\r\n */\r\n insertItems(toInsert: Data[], index: number, direction: Direction, fixRight: boolean): void {\r\n const items = new Map<number, ItemCache<Data>>();\r\n const length = toInsert.length;\r\n let min = Infinity, max = -Infinity;\r\n const set = (item: ItemCache<Data>) => {\r\n items.set(item.$index, item);\r\n min = item.$index < min ? item.$index : min;\r\n max = item.$index > max ? item.$index : max;\r\n };\r\n this.items.forEach(item => {\r\n let shift = 0;\r\n if (direction === Direction.backward) {\r\n if (item.$index < index && fixRight) {\r\n shift = -length;\r\n } else if (item.$index >= index && !fixRight) {\r\n shift = length;\r\n }\r\n } else if (direction === Direction.forward) {\r\n if (item.$index <= index && fixRight) {\r\n shift = -length;\r\n } else if (item.$index > index && !fixRight) {\r\n shift = length;\r\n }\r\n }\r\n if (shift) {\r\n item.changeIndex(item.$index + shift);\r\n }\r\n set(item);\r\n });\r\n if (this.saveData) { // persist data with no sizes\r\n toInsert.forEach((data, i) => {\r\n const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);\r\n const item = new ItemCache<Data>({ $index, data }, this.saveData);\r\n set(item);\r\n });\r\n }\r\n this.items = items;\r\n this.minIndex = min;\r\n this.maxIndex = max;\r\n }\r\n\r\n /**\r\n * Removes items from Set, shifts $indexes of items that remain.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes and default item size.\r\n *\r\n * @param {number[]} toRemove List of indexes to be removed.\r\n * @param {boolean} fixRight Defines indexes shifting strategy.\r\n * If false, indexes that are greater than the removed ones will be decreased.\r\n * If true, indexes that are less than than the removed ones will be increased.\r\n */\r\n removeItems(toRemove: number[], fixRight: boolean): void {\r\n const items = new Map<number, ItemCache<Data>>();\r\n let min = Infinity, max = -Infinity;\r\n this.items.forEach(item => {\r\n if (toRemove.some(index => index === item.$index)) {\r\n if (item.size) {\r\n this.defaultSize.setRemoved(item.size);\r\n }\r\n return;\r\n }\r\n const diff = fixRight\r\n ? toRemove.reduce((acc, index) => acc + (item.$index < index ? 1 : 0), 0)\r\n : toRemove.reduce((acc, index) => acc - (item.$index > index ? 1 : 0), 0);\r\n item.changeIndex(item.$index + diff);\r\n items.set(item.$index, item);\r\n min = item.$index < min ? item.$index : min;\r\n max = item.$index > max ? item.$index : max;\r\n });\r\n this.items = items;\r\n this.minIndex = min;\r\n this.maxIndex = max;\r\n }\r\n\r\n /**\r\n * Destructively updates Set based on subset (before-after) changes.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes. Maintains default item size on remove only.\r\n *\r\n * @param {ItemUpdate[]} before Initial subset of items to be replaced by \"after\".\r\n * Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.\r\n * Items to be removed must have toRemove flag: before[].toRemove = true.\r\n * @param {Item<Data>[]} after Transformed subset that replaces \"before\". Must be $index-incremental.\r\n * Must contain at least 1 $index from \"before\" or be empty.\r\n * @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if \"after\" is empty.\r\n */\r\n updateSubset(before: ItemUpdate[], after: Item<Data>[], fixRight?: boolean): void {\r\n if (!this.size || !before.length) {\r\n return;\r\n }\r\n const minB = before[0].$index, maxB = before[before.length - 1].$index;\r\n let leftDiff: number, rightDiff: number;\r\n if (after.length) {\r\n const minA = after[0].$index, maxA = after[after.length - 1].$index;\r\n leftDiff = minA - minB;\r\n rightDiff = maxA - maxB;\r\n } else {\r\n leftDiff = fixRight ? maxB - minB + 1 : 0;\r\n rightDiff = fixRight ? 0 : minB - maxB - 1;\r\n }\r\n const items = new Map<number, ItemCache<Data>>();\r\n this.items.forEach(item => {\r\n if (item.$index < minB) { // items to the left of the subset\r\n item.changeIndex(item.$index + leftDiff);\r\n items.set(item.$index, item);\r\n return;\r\n } else if (item.$index > maxB) { // items to the right of the subset\r\n item.changeIndex(item.$index + rightDiff);\r\n items.set(item.$index, item);\r\n return;\r\n }\r\n });\r\n after.forEach(item => // subset items\r\n items.set(item.$index, new ItemCache<Data>(item, this.saveData))\r\n );\r\n before // to maintain default size on remove\r\n .filter(item => item.toRemove)\r\n .forEach(item => this.defaultSize.setRemoved(item.size));\r\n this.minIndex += leftDiff;\r\n this.maxIndex += rightDiff;\r\n this.items = items;\r\n }\r\n\r\n /**\r\n * Shifts all indexes by some value.\r\n * Replaces current Set with a new one with new regular $indexes.\r\n * Maintains min/max indexes.\r\n *\r\n * @param {number} delta A shift value.\r\n */\r\n shiftIndexes(delta: number): void {\r\n const items = new Map<number, ItemCache<Data>>();\r\n let min = Infinity, max = -Infinity;\r\n this.items.forEach(item => {\r\n item.changeIndex(item.$index + delta);\r\n items.set(item.$index, item);\r\n min = item.$index < min ? item.$index : min;\r\n max = item.$index > max ? item.$index : max;\r\n });\r\n this.items = items;\r\n this.minIndex = min;\r\n this.maxIndex = max;\r\n }\r\n}\r\n"]}
|