vscroll 1.6.3 → 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.
Files changed (315) hide show
  1. package/dist/bundles/vscroll.esm5.js +5704 -5705
  2. package/dist/bundles/vscroll.esm5.js.map +1 -1
  3. package/dist/bundles/vscroll.esm5.min.js +2 -2
  4. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  5. package/dist/bundles/vscroll.esm6.js +5193 -5194
  6. package/dist/bundles/vscroll.esm6.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.min.js +2 -2
  8. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  9. package/dist/bundles/vscroll.umd.js +5712 -5714
  10. package/dist/bundles/vscroll.umd.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.min.js +2 -2
  12. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  13. package/dist/esm2015/classes/adapter/context.js +43 -43
  14. package/dist/esm2015/classes/adapter/context.js.map +1 -1
  15. package/dist/esm2015/classes/adapter/props.js +300 -300
  16. package/dist/esm2015/classes/adapter/wanted.js +28 -28
  17. package/dist/esm2015/classes/adapter/wanted.js.map +1 -1
  18. package/dist/esm2015/classes/adapter.js +487 -487
  19. package/dist/esm2015/classes/adapter.js.map +1 -1
  20. package/dist/esm2015/classes/buffer/cache.js +246 -246
  21. package/dist/esm2015/classes/buffer/cache.js.map +1 -1
  22. package/dist/esm2015/classes/buffer/checkCall.js +48 -48
  23. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  24. package/dist/esm2015/classes/buffer/defaultSize.js +127 -127
  25. package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
  26. package/dist/esm2015/classes/buffer.js +342 -342
  27. package/dist/esm2015/classes/buffer.js.map +1 -1
  28. package/dist/esm2015/classes/datasource.js +23 -24
  29. package/dist/esm2015/classes/datasource.js.map +1 -1
  30. package/dist/esm2015/classes/domRoutines.js +160 -160
  31. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  32. package/dist/esm2015/classes/item.js +61 -61
  33. package/dist/esm2015/classes/item.js.map +1 -1
  34. package/dist/esm2015/classes/logger.js +186 -186
  35. package/dist/esm2015/classes/logger.js.map +1 -1
  36. package/dist/esm2015/classes/paddings.js +72 -72
  37. package/dist/esm2015/classes/paddings.js.map +1 -1
  38. package/dist/esm2015/classes/reactive.js +54 -54
  39. package/dist/esm2015/classes/reactive.js.map +1 -1
  40. package/dist/esm2015/classes/settings.js +39 -39
  41. package/dist/esm2015/classes/settings.js.map +1 -1
  42. package/dist/esm2015/classes/state/clip.js +16 -16
  43. package/dist/esm2015/classes/state/clip.js.map +1 -1
  44. package/dist/esm2015/classes/state/cycle.js +60 -60
  45. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  46. package/dist/esm2015/classes/state/fetch.js +122 -122
  47. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  48. package/dist/esm2015/classes/state/render.js +14 -14
  49. package/dist/esm2015/classes/state/scroll.js +30 -30
  50. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  51. package/dist/esm2015/classes/state.js +62 -62
  52. package/dist/esm2015/classes/state.js.map +1 -1
  53. package/dist/esm2015/classes/viewport.js +72 -72
  54. package/dist/esm2015/classes/viewport.js.map +1 -1
  55. package/dist/esm2015/index.js +9 -9
  56. package/dist/esm2015/inputs/adapter.js +242 -242
  57. package/dist/esm2015/inputs/common.js +11 -11
  58. package/dist/esm2015/inputs/datasource.js +20 -20
  59. package/dist/esm2015/inputs/index.js +7 -7
  60. package/dist/esm2015/inputs/settings.js +146 -146
  61. package/dist/esm2015/inputs/validation.js +371 -374
  62. package/dist/esm2015/inputs/validation.js.map +1 -1
  63. package/dist/esm2015/inputs/workflow.js +30 -30
  64. package/dist/esm2015/interfaces/adapter.js +1 -1
  65. package/dist/esm2015/interfaces/datasource.js +1 -1
  66. package/dist/esm2015/interfaces/index.js +1 -1
  67. package/dist/esm2015/interfaces/item.js +1 -1
  68. package/dist/esm2015/interfaces/process.js +1 -1
  69. package/dist/esm2015/interfaces/process.js.map +1 -1
  70. package/dist/esm2015/interfaces/routines.js +1 -1
  71. package/dist/esm2015/interfaces/settings.js +1 -1
  72. package/dist/esm2015/interfaces/state.js +1 -1
  73. package/dist/esm2015/interfaces/validation.js +1 -1
  74. package/dist/esm2015/interfaces/workflow.js +1 -1
  75. package/dist/esm2015/processes/adapter/append.js +36 -36
  76. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  77. package/dist/esm2015/processes/adapter/check.js +32 -32
  78. package/dist/esm2015/processes/adapter/check.js.map +1 -1
  79. package/dist/esm2015/processes/adapter/clip.js +12 -12
  80. package/dist/esm2015/processes/adapter/fix.js +77 -77
  81. package/dist/esm2015/processes/adapter/fix.js.map +1 -1
  82. package/dist/esm2015/processes/adapter/insert.js +73 -73
  83. package/dist/esm2015/processes/adapter/insert.js.map +1 -1
  84. package/dist/esm2015/processes/adapter/pause.js +22 -22
  85. package/dist/esm2015/processes/adapter/pause.js.map +1 -1
  86. package/dist/esm2015/processes/adapter/reload.js +19 -19
  87. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  88. package/dist/esm2015/processes/adapter/remove.js +102 -102
  89. package/dist/esm2015/processes/adapter/remove.js.map +1 -1
  90. package/dist/esm2015/processes/adapter/replace.js +39 -39
  91. package/dist/esm2015/processes/adapter/replace.js.map +1 -1
  92. package/dist/esm2015/processes/adapter/reset.js +35 -35
  93. package/dist/esm2015/processes/adapter/reset.js.map +1 -1
  94. package/dist/esm2015/processes/adapter/update.js +43 -43
  95. package/dist/esm2015/processes/adapter/update.js.map +1 -1
  96. package/dist/esm2015/processes/adjust.js +141 -141
  97. package/dist/esm2015/processes/adjust.js.map +1 -1
  98. package/dist/esm2015/processes/clip.js +49 -49
  99. package/dist/esm2015/processes/clip.js.map +1 -1
  100. package/dist/esm2015/processes/end.js +52 -52
  101. package/dist/esm2015/processes/end.js.map +1 -1
  102. package/dist/esm2015/processes/fetch.js +91 -91
  103. package/dist/esm2015/processes/fetch.js.map +1 -1
  104. package/dist/esm2015/processes/index.js +24 -24
  105. package/dist/esm2015/processes/init.js +14 -14
  106. package/dist/esm2015/processes/misc/base.js +30 -30
  107. package/dist/esm2015/processes/misc/base.js.map +1 -1
  108. package/dist/esm2015/processes/misc/enums.js +36 -36
  109. package/dist/esm2015/processes/misc/index.js +2 -2
  110. package/dist/esm2015/processes/postFetch.js +65 -65
  111. package/dist/esm2015/processes/postFetch.js.map +1 -1
  112. package/dist/esm2015/processes/preClip.js +85 -85
  113. package/dist/esm2015/processes/preClip.js.map +1 -1
  114. package/dist/esm2015/processes/preFetch.js +240 -240
  115. package/dist/esm2015/processes/preFetch.js.map +1 -1
  116. package/dist/esm2015/processes/render.js +54 -54
  117. package/dist/esm2015/processes/render.js.map +1 -1
  118. package/dist/esm2015/processes/scroll.js +97 -97
  119. package/dist/esm2015/processes/scroll.js.map +1 -1
  120. package/dist/esm2015/processes/start.js +11 -11
  121. package/dist/esm2015/scroller.js +86 -86
  122. package/dist/esm2015/scroller.js.map +1 -1
  123. package/dist/esm2015/version.js +4 -4
  124. package/dist/esm2015/version.js.map +1 -1
  125. package/dist/esm2015/workflow-transducer.js +218 -218
  126. package/dist/esm2015/workflow-transducer.js.map +1 -1
  127. package/dist/esm2015/workflow.js +174 -174
  128. package/dist/esm2015/workflow.js.map +1 -1
  129. package/dist/esm5/classes/adapter/context.js +50 -50
  130. package/dist/esm5/classes/adapter/context.js.map +1 -1
  131. package/dist/esm5/classes/adapter/props.js +300 -300
  132. package/dist/esm5/classes/adapter/wanted.js +29 -29
  133. package/dist/esm5/classes/adapter/wanted.js.map +1 -1
  134. package/dist/esm5/classes/adapter.js +535 -535
  135. package/dist/esm5/classes/adapter.js.map +1 -1
  136. package/dist/esm5/classes/buffer/cache.js +260 -260
  137. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  138. package/dist/esm5/classes/buffer/checkCall.js +56 -56
  139. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  140. package/dist/esm5/classes/buffer/defaultSize.js +145 -145
  141. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  142. package/dist/esm5/classes/buffer.js +409 -409
  143. package/dist/esm5/classes/buffer.js.map +1 -1
  144. package/dist/esm5/classes/datasource.js +30 -31
  145. package/dist/esm5/classes/datasource.js.map +1 -1
  146. package/dist/esm5/classes/domRoutines.js +165 -165
  147. package/dist/esm5/classes/domRoutines.js.map +1 -1
  148. package/dist/esm5/classes/item.js +76 -76
  149. package/dist/esm5/classes/item.js.map +1 -1
  150. package/dist/esm5/classes/logger.js +210 -210
  151. package/dist/esm5/classes/logger.js.map +1 -1
  152. package/dist/esm5/classes/paddings.js +80 -80
  153. package/dist/esm5/classes/paddings.js.map +1 -1
  154. package/dist/esm5/classes/reactive.js +69 -69
  155. package/dist/esm5/classes/reactive.js.map +1 -1
  156. package/dist/esm5/classes/settings.js +47 -47
  157. package/dist/esm5/classes/settings.js.map +1 -1
  158. package/dist/esm5/classes/state/clip.js +22 -22
  159. package/dist/esm5/classes/state/clip.js.map +1 -1
  160. package/dist/esm5/classes/state/cycle.js +75 -75
  161. package/dist/esm5/classes/state/cycle.js.map +1 -1
  162. package/dist/esm5/classes/state/fetch.js +148 -148
  163. package/dist/esm5/classes/state/fetch.js.map +1 -1
  164. package/dist/esm5/classes/state/render.js +20 -20
  165. package/dist/esm5/classes/state/scroll.js +32 -32
  166. package/dist/esm5/classes/state/scroll.js.map +1 -1
  167. package/dist/esm5/classes/state.js +69 -69
  168. package/dist/esm5/classes/state.js.map +1 -1
  169. package/dist/esm5/classes/viewport.js +79 -79
  170. package/dist/esm5/classes/viewport.js.map +1 -1
  171. package/dist/esm5/index.js +9 -9
  172. package/dist/esm5/inputs/adapter.js +243 -243
  173. package/dist/esm5/inputs/common.js +11 -11
  174. package/dist/esm5/inputs/datasource.js +21 -21
  175. package/dist/esm5/inputs/index.js +7 -7
  176. package/dist/esm5/inputs/settings.js +147 -147
  177. package/dist/esm5/inputs/validation.js +393 -396
  178. package/dist/esm5/inputs/validation.js.map +1 -1
  179. package/dist/esm5/inputs/workflow.js +31 -31
  180. package/dist/esm5/interfaces/adapter.js +1 -1
  181. package/dist/esm5/interfaces/datasource.js +1 -1
  182. package/dist/esm5/interfaces/index.js +1 -1
  183. package/dist/esm5/interfaces/item.js +1 -1
  184. package/dist/esm5/interfaces/process.js +1 -1
  185. package/dist/esm5/interfaces/process.js.map +1 -1
  186. package/dist/esm5/interfaces/routines.js +1 -1
  187. package/dist/esm5/interfaces/settings.js +1 -1
  188. package/dist/esm5/interfaces/state.js +1 -1
  189. package/dist/esm5/interfaces/validation.js +1 -1
  190. package/dist/esm5/interfaces/workflow.js +1 -1
  191. package/dist/esm5/processes/adapter/append.js +44 -44
  192. package/dist/esm5/processes/adapter/append.js.map +1 -1
  193. package/dist/esm5/processes/adapter/check.js +39 -39
  194. package/dist/esm5/processes/adapter/check.js.map +1 -1
  195. package/dist/esm5/processes/adapter/clip.js +19 -19
  196. package/dist/esm5/processes/adapter/fix.js +89 -89
  197. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  198. package/dist/esm5/processes/adapter/insert.js +81 -81
  199. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  200. package/dist/esm5/processes/adapter/pause.js +29 -29
  201. package/dist/esm5/processes/adapter/pause.js.map +1 -1
  202. package/dist/esm5/processes/adapter/reload.js +26 -26
  203. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  204. package/dist/esm5/processes/adapter/remove.js +115 -115
  205. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  206. package/dist/esm5/processes/adapter/replace.js +47 -47
  207. package/dist/esm5/processes/adapter/replace.js.map +1 -1
  208. package/dist/esm5/processes/adapter/reset.js +42 -42
  209. package/dist/esm5/processes/adapter/reset.js.map +1 -1
  210. package/dist/esm5/processes/adapter/update.js +59 -59
  211. package/dist/esm5/processes/adapter/update.js.map +1 -1
  212. package/dist/esm5/processes/adjust.js +152 -152
  213. package/dist/esm5/processes/adjust.js.map +1 -1
  214. package/dist/esm5/processes/clip.js +60 -60
  215. package/dist/esm5/processes/clip.js.map +1 -1
  216. package/dist/esm5/processes/end.js +63 -63
  217. package/dist/esm5/processes/end.js.map +1 -1
  218. package/dist/esm5/processes/fetch.js +102 -102
  219. package/dist/esm5/processes/fetch.js.map +1 -1
  220. package/dist/esm5/processes/index.js +24 -24
  221. package/dist/esm5/processes/init.js +21 -21
  222. package/dist/esm5/processes/misc/base.js +44 -44
  223. package/dist/esm5/processes/misc/base.js.map +1 -1
  224. package/dist/esm5/processes/misc/enums.js +36 -36
  225. package/dist/esm5/processes/misc/index.js +2 -2
  226. package/dist/esm5/processes/postFetch.js +74 -74
  227. package/dist/esm5/processes/postFetch.js.map +1 -1
  228. package/dist/esm5/processes/preClip.js +94 -94
  229. package/dist/esm5/processes/preClip.js.map +1 -1
  230. package/dist/esm5/processes/preFetch.js +247 -247
  231. package/dist/esm5/processes/preFetch.js.map +1 -1
  232. package/dist/esm5/processes/render.js +63 -63
  233. package/dist/esm5/processes/render.js.map +1 -1
  234. package/dist/esm5/processes/scroll.js +107 -107
  235. package/dist/esm5/processes/scroll.js.map +1 -1
  236. package/dist/esm5/processes/start.js +18 -18
  237. package/dist/esm5/scroller.js +100 -100
  238. package/dist/esm5/scroller.js.map +1 -1
  239. package/dist/esm5/version.js +4 -4
  240. package/dist/esm5/version.js.map +1 -1
  241. package/dist/esm5/workflow-transducer.js +220 -220
  242. package/dist/esm5/workflow-transducer.js.map +1 -1
  243. package/dist/esm5/workflow.js +198 -198
  244. package/dist/esm5/workflow.js.map +1 -1
  245. package/dist/typings/classes/adapter/context.d.ts +4 -4
  246. package/dist/typings/classes/adapter/props.d.ts +52 -52
  247. package/dist/typings/classes/adapter/wanted.d.ts +14 -14
  248. package/dist/typings/classes/adapter.d.ts +79 -79
  249. package/dist/typings/classes/buffer/cache.d.ts +95 -95
  250. package/dist/typings/classes/buffer/checkCall.d.ts +12 -12
  251. package/dist/typings/classes/buffer/defaultSize.d.ts +32 -32
  252. package/dist/typings/classes/buffer.d.ts +64 -64
  253. package/dist/typings/classes/datasource.d.ts +11 -11
  254. package/dist/typings/classes/domRoutines.d.ts +36 -36
  255. package/dist/typings/classes/item.d.ts +28 -28
  256. package/dist/typings/classes/logger.d.ts +28 -28
  257. package/dist/typings/classes/paddings.d.ts +22 -22
  258. package/dist/typings/classes/reactive.d.ts +21 -21
  259. package/dist/typings/classes/settings.d.ts +119 -119
  260. package/dist/typings/classes/state/clip.d.ts +9 -9
  261. package/dist/typings/classes/state/cycle.d.ts +29 -29
  262. package/dist/typings/classes/state/fetch.d.ts +62 -62
  263. package/dist/typings/classes/state/render.d.ts +9 -9
  264. package/dist/typings/classes/state/scroll.d.ts +16 -16
  265. package/dist/typings/classes/state.d.ts +29 -29
  266. package/dist/typings/classes/viewport.d.ts +32 -32
  267. package/dist/typings/index.d.ts +10 -10
  268. package/dist/typings/inputs/adapter.d.ts +5 -5
  269. package/dist/typings/inputs/common.d.ts +9 -9
  270. package/dist/typings/inputs/datasource.d.ts +7 -7
  271. package/dist/typings/inputs/index.d.ts +7 -7
  272. package/dist/typings/inputs/settings.d.ts +41 -41
  273. package/dist/typings/inputs/validation.d.ts +82 -83
  274. package/dist/typings/inputs/workflow.d.ts +9 -9
  275. package/dist/typings/interfaces/adapter.d.ts +164 -164
  276. package/dist/typings/interfaces/datasource.d.ts +28 -28
  277. package/dist/typings/interfaces/index.d.ts +10 -10
  278. package/dist/typings/interfaces/item.d.ts +8 -8
  279. package/dist/typings/interfaces/process.d.ts +35 -35
  280. package/dist/typings/interfaces/routines.d.ts +166 -166
  281. package/dist/typings/interfaces/settings.d.ts +31 -31
  282. package/dist/typings/interfaces/state.d.ts +24 -24
  283. package/dist/typings/interfaces/validation.d.ts +33 -33
  284. package/dist/typings/interfaces/workflow.d.ts +53 -53
  285. package/dist/typings/processes/adapter/append.d.ts +14 -14
  286. package/dist/typings/processes/adapter/check.d.ts +6 -6
  287. package/dist/typings/processes/adapter/clip.d.ts +7 -7
  288. package/dist/typings/processes/adapter/fix.d.ts +13 -13
  289. package/dist/typings/processes/adapter/insert.d.ts +11 -11
  290. package/dist/typings/processes/adapter/pause.d.ts +8 -8
  291. package/dist/typings/processes/adapter/reload.d.ts +6 -6
  292. package/dist/typings/processes/adapter/remove.d.ts +11 -11
  293. package/dist/typings/processes/adapter/replace.d.ts +8 -8
  294. package/dist/typings/processes/adapter/reset.d.ts +7 -7
  295. package/dist/typings/processes/adapter/update.d.ts +8 -8
  296. package/dist/typings/processes/adjust.d.ts +10 -10
  297. package/dist/typings/processes/clip.d.ts +7 -7
  298. package/dist/typings/processes/end.d.ts +10 -10
  299. package/dist/typings/processes/fetch.d.ts +18 -18
  300. package/dist/typings/processes/index.d.ts +24 -24
  301. package/dist/typings/processes/init.d.ts +7 -7
  302. package/dist/typings/processes/misc/base.d.ts +4 -4
  303. package/dist/typings/processes/misc/enums.d.ts +33 -33
  304. package/dist/typings/processes/misc/index.d.ts +2 -2
  305. package/dist/typings/processes/postFetch.d.ts +8 -8
  306. package/dist/typings/processes/preClip.d.ts +12 -12
  307. package/dist/typings/processes/preFetch.d.ts +17 -17
  308. package/dist/typings/processes/render.d.ts +9 -9
  309. package/dist/typings/processes/scroll.d.ts +13 -13
  310. package/dist/typings/processes/start.d.ts +6 -6
  311. package/dist/typings/scroller.d.ts +26 -26
  312. package/dist/typings/version.d.ts +5 -5
  313. package/dist/typings/workflow-transducer.d.ts +2 -2
  314. package/dist/typings/workflow.d.ts +29 -29
  315. 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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,OAAO,EAAgB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAc7D,MAAM,OAAO,SAAS;IAMpB,YAAY,IAAuB,EAAE,QAAiB;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;CACF;AAED,MAAM,OAAO,KAAK;IAYhB,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAY,EAAE,MAAc;QACxF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,KAAK,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QACrC,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SACpB;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IACrD,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,sBAAsB;QACpB,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,kCAAkC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAC,IAAgB;QAClB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,SAAS,EAAE,EAAE,gCAAgC;YAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;aAC5B;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;gBAChC,IAAI,SAAS,CAAC,IAAI,EAAE;oBAClB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;iBACxD;qBAAM;oBACL,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACpC;gBACD,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;aAC5B;SACF;aAAM;YACL,SAAS,GAAG,IAAI,SAAS,CAAO,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACpC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;SAC7B;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;SAC7B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,QAAgB,EAAE,KAAa,EAAE,SAAoB,EAAE,QAAiB;QAClF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC;QACpC,MAAM,GAAG,GAAG,CAAC,IAAqB,EAAE,EAAE;YACpC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5C,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,CAAC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,SAAS,KAAK,SAAS,CAAC,QAAQ,EAAE;gBACpC,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,QAAQ,EAAE;oBACnC,KAAK,GAAG,CAAC,MAAM,CAAC;iBACjB;qBAAM,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE;oBAC5C,KAAK,GAAG,MAAM,CAAC;iBAChB;aACF;iBAAM,IAAI,SAAS,KAAK,SAAS,CAAC,OAAO,EAAE;gBAC1C,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,QAAQ,EAAE;oBACpC,KAAK,GAAG,CAAC,MAAM,CAAC;iBACjB;qBAAM,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE;oBAC3C,KAAK,GAAG,MAAM,CAAC;iBAChB;aACF;YACD,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;aACvC;YACD,GAAG,CAAC,IAAI,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,6BAA6B;YAChD,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC3B,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/F,MAAM,IAAI,GAAG,IAAI,SAAS,CAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClE,GAAG,CAAC,IAAI,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC;SACJ;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,QAAkB,EAAE,QAAiB;QAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;QACjD,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE;gBACjD,IAAI,IAAI,CAAC,IAAI,EAAE;oBACb,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACxC;gBACD,OAAO;aACR;YACD,MAAM,IAAI,GAAG,QAAQ;gBACnB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YACrC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5C,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,MAAoB,EAAE,KAAmB,EAAE,QAAkB;QACxE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAChC,OAAO;SACR;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACvE,IAAI,QAAgB,EAAE,SAAiB,CAAC;QACxC,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YACpE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;YACvB,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;SACzB;aAAM;YACL,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;SAC5C;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE,kCAAkC;gBAC1D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;gBACzC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7B,OAAO;aACR;iBAAM,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE,mCAAmC;gBAClE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;gBAC1C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7B,OAAO;aACR;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe;SACnC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,SAAS,CAAO,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CACjE,CAAC;QACF,MAAM,CAAC,qCAAqC;aACzC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC1B,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,KAAa;QACxB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;QACjD,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YACtC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5C,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;CACF","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"]}