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.
Files changed (321) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/bundles/vscroll.esm5.js +5704 -5694
  4. package/dist/bundles/vscroll.esm5.js.map +1 -1
  5. package/dist/bundles/vscroll.esm5.min.js +2 -2
  6. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.js +5193 -5183
  8. package/dist/bundles/vscroll.esm6.js.map +1 -1
  9. package/dist/bundles/vscroll.esm6.min.js +2 -2
  10. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.js +5712 -5703
  12. package/dist/bundles/vscroll.umd.js.map +1 -1
  13. package/dist/bundles/vscroll.umd.min.js +2 -2
  14. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  15. package/dist/esm2015/classes/adapter/context.js +43 -43
  16. package/dist/esm2015/classes/adapter/context.js.map +1 -1
  17. package/dist/esm2015/classes/adapter/props.js +300 -300
  18. package/dist/esm2015/classes/adapter/wanted.js +28 -28
  19. package/dist/esm2015/classes/adapter/wanted.js.map +1 -1
  20. package/dist/esm2015/classes/adapter.js +487 -487
  21. package/dist/esm2015/classes/adapter.js.map +1 -1
  22. package/dist/esm2015/classes/buffer/cache.js +246 -246
  23. package/dist/esm2015/classes/buffer/cache.js.map +1 -1
  24. package/dist/esm2015/classes/buffer/checkCall.js +48 -48
  25. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  26. package/dist/esm2015/classes/buffer/defaultSize.js +127 -127
  27. package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
  28. package/dist/esm2015/classes/buffer.js +342 -342
  29. package/dist/esm2015/classes/buffer.js.map +1 -1
  30. package/dist/esm2015/classes/datasource.js +23 -24
  31. package/dist/esm2015/classes/datasource.js.map +1 -1
  32. package/dist/esm2015/classes/domRoutines.js +160 -160
  33. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  34. package/dist/esm2015/classes/item.js +61 -61
  35. package/dist/esm2015/classes/item.js.map +1 -1
  36. package/dist/esm2015/classes/logger.js +186 -186
  37. package/dist/esm2015/classes/logger.js.map +1 -1
  38. package/dist/esm2015/classes/paddings.js +72 -72
  39. package/dist/esm2015/classes/paddings.js.map +1 -1
  40. package/dist/esm2015/classes/reactive.js +54 -54
  41. package/dist/esm2015/classes/reactive.js.map +1 -1
  42. package/dist/esm2015/classes/settings.js +39 -39
  43. package/dist/esm2015/classes/settings.js.map +1 -1
  44. package/dist/esm2015/classes/state/clip.js +16 -16
  45. package/dist/esm2015/classes/state/clip.js.map +1 -1
  46. package/dist/esm2015/classes/state/cycle.js +60 -60
  47. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  48. package/dist/esm2015/classes/state/fetch.js +122 -122
  49. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  50. package/dist/esm2015/classes/state/render.js +14 -14
  51. package/dist/esm2015/classes/state/scroll.js +30 -30
  52. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  53. package/dist/esm2015/classes/state.js +62 -62
  54. package/dist/esm2015/classes/state.js.map +1 -1
  55. package/dist/esm2015/classes/viewport.js +72 -72
  56. package/dist/esm2015/classes/viewport.js.map +1 -1
  57. package/dist/esm2015/index.js +9 -9
  58. package/dist/esm2015/inputs/adapter.js +242 -232
  59. package/dist/esm2015/inputs/adapter.js.map +1 -1
  60. package/dist/esm2015/inputs/common.js +11 -11
  61. package/dist/esm2015/inputs/datasource.js +20 -20
  62. package/dist/esm2015/inputs/index.js +7 -7
  63. package/dist/esm2015/inputs/settings.js +146 -146
  64. package/dist/esm2015/inputs/validation.js +371 -374
  65. package/dist/esm2015/inputs/validation.js.map +1 -1
  66. package/dist/esm2015/inputs/workflow.js +30 -30
  67. package/dist/esm2015/interfaces/adapter.js +1 -1
  68. package/dist/esm2015/interfaces/adapter.js.map +1 -1
  69. package/dist/esm2015/interfaces/datasource.js +1 -1
  70. package/dist/esm2015/interfaces/index.js +1 -1
  71. package/dist/esm2015/interfaces/item.js +1 -1
  72. package/dist/esm2015/interfaces/process.js +1 -1
  73. package/dist/esm2015/interfaces/process.js.map +1 -1
  74. package/dist/esm2015/interfaces/routines.js +1 -1
  75. package/dist/esm2015/interfaces/settings.js +1 -1
  76. package/dist/esm2015/interfaces/state.js +1 -1
  77. package/dist/esm2015/interfaces/validation.js +1 -1
  78. package/dist/esm2015/interfaces/workflow.js +1 -1
  79. package/dist/esm2015/processes/adapter/append.js +36 -35
  80. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  81. package/dist/esm2015/processes/adapter/check.js +32 -32
  82. package/dist/esm2015/processes/adapter/check.js.map +1 -1
  83. package/dist/esm2015/processes/adapter/clip.js +12 -12
  84. package/dist/esm2015/processes/adapter/fix.js +77 -77
  85. package/dist/esm2015/processes/adapter/fix.js.map +1 -1
  86. package/dist/esm2015/processes/adapter/insert.js +73 -73
  87. package/dist/esm2015/processes/adapter/insert.js.map +1 -1
  88. package/dist/esm2015/processes/adapter/pause.js +22 -22
  89. package/dist/esm2015/processes/adapter/pause.js.map +1 -1
  90. package/dist/esm2015/processes/adapter/reload.js +19 -19
  91. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  92. package/dist/esm2015/processes/adapter/remove.js +102 -102
  93. package/dist/esm2015/processes/adapter/remove.js.map +1 -1
  94. package/dist/esm2015/processes/adapter/replace.js +39 -39
  95. package/dist/esm2015/processes/adapter/replace.js.map +1 -1
  96. package/dist/esm2015/processes/adapter/reset.js +35 -35
  97. package/dist/esm2015/processes/adapter/reset.js.map +1 -1
  98. package/dist/esm2015/processes/adapter/update.js +43 -43
  99. package/dist/esm2015/processes/adapter/update.js.map +1 -1
  100. package/dist/esm2015/processes/adjust.js +141 -141
  101. package/dist/esm2015/processes/adjust.js.map +1 -1
  102. package/dist/esm2015/processes/clip.js +49 -49
  103. package/dist/esm2015/processes/clip.js.map +1 -1
  104. package/dist/esm2015/processes/end.js +52 -52
  105. package/dist/esm2015/processes/end.js.map +1 -1
  106. package/dist/esm2015/processes/fetch.js +91 -91
  107. package/dist/esm2015/processes/fetch.js.map +1 -1
  108. package/dist/esm2015/processes/index.js +24 -24
  109. package/dist/esm2015/processes/init.js +14 -14
  110. package/dist/esm2015/processes/misc/base.js +30 -30
  111. package/dist/esm2015/processes/misc/base.js.map +1 -1
  112. package/dist/esm2015/processes/misc/enums.js +36 -36
  113. package/dist/esm2015/processes/misc/index.js +2 -2
  114. package/dist/esm2015/processes/postFetch.js +65 -65
  115. package/dist/esm2015/processes/postFetch.js.map +1 -1
  116. package/dist/esm2015/processes/preClip.js +85 -85
  117. package/dist/esm2015/processes/preClip.js.map +1 -1
  118. package/dist/esm2015/processes/preFetch.js +240 -240
  119. package/dist/esm2015/processes/preFetch.js.map +1 -1
  120. package/dist/esm2015/processes/render.js +54 -54
  121. package/dist/esm2015/processes/render.js.map +1 -1
  122. package/dist/esm2015/processes/scroll.js +97 -97
  123. package/dist/esm2015/processes/scroll.js.map +1 -1
  124. package/dist/esm2015/processes/start.js +11 -11
  125. package/dist/esm2015/scroller.js +86 -86
  126. package/dist/esm2015/scroller.js.map +1 -1
  127. package/dist/esm2015/version.js +4 -4
  128. package/dist/esm2015/version.js.map +1 -1
  129. package/dist/esm2015/workflow-transducer.js +218 -218
  130. package/dist/esm2015/workflow-transducer.js.map +1 -1
  131. package/dist/esm2015/workflow.js +174 -174
  132. package/dist/esm2015/workflow.js.map +1 -1
  133. package/dist/esm5/classes/adapter/context.js +50 -50
  134. package/dist/esm5/classes/adapter/context.js.map +1 -1
  135. package/dist/esm5/classes/adapter/props.js +300 -300
  136. package/dist/esm5/classes/adapter/wanted.js +29 -29
  137. package/dist/esm5/classes/adapter/wanted.js.map +1 -1
  138. package/dist/esm5/classes/adapter.js +535 -535
  139. package/dist/esm5/classes/adapter.js.map +1 -1
  140. package/dist/esm5/classes/buffer/cache.js +260 -260
  141. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  142. package/dist/esm5/classes/buffer/checkCall.js +56 -56
  143. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  144. package/dist/esm5/classes/buffer/defaultSize.js +145 -145
  145. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  146. package/dist/esm5/classes/buffer.js +409 -409
  147. package/dist/esm5/classes/buffer.js.map +1 -1
  148. package/dist/esm5/classes/datasource.js +30 -31
  149. package/dist/esm5/classes/datasource.js.map +1 -1
  150. package/dist/esm5/classes/domRoutines.js +165 -165
  151. package/dist/esm5/classes/domRoutines.js.map +1 -1
  152. package/dist/esm5/classes/item.js +76 -76
  153. package/dist/esm5/classes/item.js.map +1 -1
  154. package/dist/esm5/classes/logger.js +210 -210
  155. package/dist/esm5/classes/logger.js.map +1 -1
  156. package/dist/esm5/classes/paddings.js +80 -80
  157. package/dist/esm5/classes/paddings.js.map +1 -1
  158. package/dist/esm5/classes/reactive.js +69 -69
  159. package/dist/esm5/classes/reactive.js.map +1 -1
  160. package/dist/esm5/classes/settings.js +47 -47
  161. package/dist/esm5/classes/settings.js.map +1 -1
  162. package/dist/esm5/classes/state/clip.js +22 -22
  163. package/dist/esm5/classes/state/clip.js.map +1 -1
  164. package/dist/esm5/classes/state/cycle.js +75 -75
  165. package/dist/esm5/classes/state/cycle.js.map +1 -1
  166. package/dist/esm5/classes/state/fetch.js +148 -148
  167. package/dist/esm5/classes/state/fetch.js.map +1 -1
  168. package/dist/esm5/classes/state/render.js +20 -20
  169. package/dist/esm5/classes/state/scroll.js +32 -32
  170. package/dist/esm5/classes/state/scroll.js.map +1 -1
  171. package/dist/esm5/classes/state.js +69 -69
  172. package/dist/esm5/classes/state.js.map +1 -1
  173. package/dist/esm5/classes/viewport.js +79 -79
  174. package/dist/esm5/classes/viewport.js.map +1 -1
  175. package/dist/esm5/index.js +9 -9
  176. package/dist/esm5/inputs/adapter.js +243 -233
  177. package/dist/esm5/inputs/adapter.js.map +1 -1
  178. package/dist/esm5/inputs/common.js +11 -11
  179. package/dist/esm5/inputs/datasource.js +21 -21
  180. package/dist/esm5/inputs/index.js +7 -7
  181. package/dist/esm5/inputs/settings.js +147 -147
  182. package/dist/esm5/inputs/validation.js +393 -396
  183. package/dist/esm5/inputs/validation.js.map +1 -1
  184. package/dist/esm5/inputs/workflow.js +31 -31
  185. package/dist/esm5/interfaces/adapter.js +1 -1
  186. package/dist/esm5/interfaces/adapter.js.map +1 -1
  187. package/dist/esm5/interfaces/datasource.js +1 -1
  188. package/dist/esm5/interfaces/index.js +1 -1
  189. package/dist/esm5/interfaces/item.js +1 -1
  190. package/dist/esm5/interfaces/process.js +1 -1
  191. package/dist/esm5/interfaces/process.js.map +1 -1
  192. package/dist/esm5/interfaces/routines.js +1 -1
  193. package/dist/esm5/interfaces/settings.js +1 -1
  194. package/dist/esm5/interfaces/state.js +1 -1
  195. package/dist/esm5/interfaces/validation.js +1 -1
  196. package/dist/esm5/interfaces/workflow.js +1 -1
  197. package/dist/esm5/processes/adapter/append.js +44 -43
  198. package/dist/esm5/processes/adapter/append.js.map +1 -1
  199. package/dist/esm5/processes/adapter/check.js +39 -39
  200. package/dist/esm5/processes/adapter/check.js.map +1 -1
  201. package/dist/esm5/processes/adapter/clip.js +19 -19
  202. package/dist/esm5/processes/adapter/fix.js +89 -89
  203. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  204. package/dist/esm5/processes/adapter/insert.js +81 -81
  205. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  206. package/dist/esm5/processes/adapter/pause.js +29 -29
  207. package/dist/esm5/processes/adapter/pause.js.map +1 -1
  208. package/dist/esm5/processes/adapter/reload.js +26 -26
  209. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  210. package/dist/esm5/processes/adapter/remove.js +115 -115
  211. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  212. package/dist/esm5/processes/adapter/replace.js +47 -47
  213. package/dist/esm5/processes/adapter/replace.js.map +1 -1
  214. package/dist/esm5/processes/adapter/reset.js +42 -42
  215. package/dist/esm5/processes/adapter/reset.js.map +1 -1
  216. package/dist/esm5/processes/adapter/update.js +59 -59
  217. package/dist/esm5/processes/adapter/update.js.map +1 -1
  218. package/dist/esm5/processes/adjust.js +152 -152
  219. package/dist/esm5/processes/adjust.js.map +1 -1
  220. package/dist/esm5/processes/clip.js +60 -60
  221. package/dist/esm5/processes/clip.js.map +1 -1
  222. package/dist/esm5/processes/end.js +63 -63
  223. package/dist/esm5/processes/end.js.map +1 -1
  224. package/dist/esm5/processes/fetch.js +102 -102
  225. package/dist/esm5/processes/fetch.js.map +1 -1
  226. package/dist/esm5/processes/index.js +24 -24
  227. package/dist/esm5/processes/init.js +21 -21
  228. package/dist/esm5/processes/misc/base.js +44 -44
  229. package/dist/esm5/processes/misc/base.js.map +1 -1
  230. package/dist/esm5/processes/misc/enums.js +36 -36
  231. package/dist/esm5/processes/misc/index.js +2 -2
  232. package/dist/esm5/processes/postFetch.js +74 -74
  233. package/dist/esm5/processes/postFetch.js.map +1 -1
  234. package/dist/esm5/processes/preClip.js +94 -94
  235. package/dist/esm5/processes/preClip.js.map +1 -1
  236. package/dist/esm5/processes/preFetch.js +247 -247
  237. package/dist/esm5/processes/preFetch.js.map +1 -1
  238. package/dist/esm5/processes/render.js +63 -63
  239. package/dist/esm5/processes/render.js.map +1 -1
  240. package/dist/esm5/processes/scroll.js +107 -107
  241. package/dist/esm5/processes/scroll.js.map +1 -1
  242. package/dist/esm5/processes/start.js +18 -18
  243. package/dist/esm5/scroller.js +100 -100
  244. package/dist/esm5/scroller.js.map +1 -1
  245. package/dist/esm5/version.js +4 -4
  246. package/dist/esm5/version.js.map +1 -1
  247. package/dist/esm5/workflow-transducer.js +220 -220
  248. package/dist/esm5/workflow-transducer.js.map +1 -1
  249. package/dist/esm5/workflow.js +198 -198
  250. package/dist/esm5/workflow.js.map +1 -1
  251. package/dist/typings/classes/adapter/context.d.ts +4 -4
  252. package/dist/typings/classes/adapter/props.d.ts +52 -52
  253. package/dist/typings/classes/adapter/wanted.d.ts +14 -14
  254. package/dist/typings/classes/adapter.d.ts +79 -79
  255. package/dist/typings/classes/buffer/cache.d.ts +95 -95
  256. package/dist/typings/classes/buffer/checkCall.d.ts +12 -12
  257. package/dist/typings/classes/buffer/defaultSize.d.ts +32 -32
  258. package/dist/typings/classes/buffer.d.ts +64 -64
  259. package/dist/typings/classes/datasource.d.ts +11 -11
  260. package/dist/typings/classes/domRoutines.d.ts +36 -36
  261. package/dist/typings/classes/item.d.ts +28 -28
  262. package/dist/typings/classes/logger.d.ts +28 -28
  263. package/dist/typings/classes/paddings.d.ts +22 -22
  264. package/dist/typings/classes/reactive.d.ts +21 -21
  265. package/dist/typings/classes/settings.d.ts +119 -119
  266. package/dist/typings/classes/state/clip.d.ts +9 -9
  267. package/dist/typings/classes/state/cycle.d.ts +29 -29
  268. package/dist/typings/classes/state/fetch.d.ts +62 -62
  269. package/dist/typings/classes/state/render.d.ts +9 -9
  270. package/dist/typings/classes/state/scroll.d.ts +16 -16
  271. package/dist/typings/classes/state.d.ts +29 -29
  272. package/dist/typings/classes/viewport.d.ts +32 -32
  273. package/dist/typings/index.d.ts +10 -10
  274. package/dist/typings/inputs/adapter.d.ts +5 -5
  275. package/dist/typings/inputs/common.d.ts +9 -9
  276. package/dist/typings/inputs/datasource.d.ts +7 -7
  277. package/dist/typings/inputs/index.d.ts +7 -7
  278. package/dist/typings/inputs/settings.d.ts +41 -41
  279. package/dist/typings/inputs/validation.d.ts +82 -83
  280. package/dist/typings/inputs/workflow.d.ts +9 -9
  281. package/dist/typings/interfaces/adapter.d.ts +164 -161
  282. package/dist/typings/interfaces/datasource.d.ts +28 -28
  283. package/dist/typings/interfaces/index.d.ts +10 -10
  284. package/dist/typings/interfaces/item.d.ts +8 -8
  285. package/dist/typings/interfaces/process.d.ts +35 -35
  286. package/dist/typings/interfaces/routines.d.ts +166 -166
  287. package/dist/typings/interfaces/settings.d.ts +31 -31
  288. package/dist/typings/interfaces/state.d.ts +24 -24
  289. package/dist/typings/interfaces/validation.d.ts +33 -33
  290. package/dist/typings/interfaces/workflow.d.ts +53 -53
  291. package/dist/typings/processes/adapter/append.d.ts +14 -14
  292. package/dist/typings/processes/adapter/check.d.ts +6 -6
  293. package/dist/typings/processes/adapter/clip.d.ts +7 -7
  294. package/dist/typings/processes/adapter/fix.d.ts +13 -13
  295. package/dist/typings/processes/adapter/insert.d.ts +11 -11
  296. package/dist/typings/processes/adapter/pause.d.ts +8 -8
  297. package/dist/typings/processes/adapter/reload.d.ts +6 -6
  298. package/dist/typings/processes/adapter/remove.d.ts +11 -11
  299. package/dist/typings/processes/adapter/replace.d.ts +8 -8
  300. package/dist/typings/processes/adapter/reset.d.ts +7 -7
  301. package/dist/typings/processes/adapter/update.d.ts +8 -8
  302. package/dist/typings/processes/adjust.d.ts +10 -10
  303. package/dist/typings/processes/clip.d.ts +7 -7
  304. package/dist/typings/processes/end.d.ts +10 -10
  305. package/dist/typings/processes/fetch.d.ts +18 -18
  306. package/dist/typings/processes/index.d.ts +24 -24
  307. package/dist/typings/processes/init.d.ts +7 -7
  308. package/dist/typings/processes/misc/base.d.ts +4 -4
  309. package/dist/typings/processes/misc/enums.d.ts +33 -33
  310. package/dist/typings/processes/misc/index.d.ts +2 -2
  311. package/dist/typings/processes/postFetch.d.ts +8 -8
  312. package/dist/typings/processes/preClip.d.ts +12 -12
  313. package/dist/typings/processes/preFetch.d.ts +17 -17
  314. package/dist/typings/processes/render.d.ts +9 -9
  315. package/dist/typings/processes/scroll.d.ts +13 -13
  316. package/dist/typings/processes/start.d.ts +6 -6
  317. package/dist/typings/scroller.d.ts +26 -26
  318. package/dist/typings/version.d.ts +5 -5
  319. package/dist/typings/workflow-transducer.d.ts +2 -2
  320. package/dist/typings/workflow.d.ts +29 -29
  321. package/package.json +19 -18
@@ -1,49 +1,49 @@
1
- import { Direction } from '../../inputs/index';
2
- export class CheckBufferCall {
3
- constructor(context, logger) {
4
- this.context = context;
5
- this.logger = logger;
6
- }
7
- fillEmpty(items, before, after) {
8
- if (!items.length) {
9
- this.logger.log('no items to fill the buffer; empty list');
10
- return false;
11
- }
12
- if (!Number.isInteger(before) && !Number.isInteger(after)) {
13
- this.logger.log('no items to fill the buffer; wrong indexes');
14
- return false;
15
- }
16
- this.logger.log(() => `going to fill the buffer with ${items.length} item(s)`);
17
- return true;
18
- }
19
- insertInBuffer(predicate, before, after) {
20
- const index = Number.isInteger(before) ? before : (Number.isInteger(after) ? after : NaN);
21
- const found = this.context.items.find(item => (predicate && predicate(item.get())) ||
22
- (Number.isInteger(index) && index === item.$index));
23
- if (!found) {
24
- this.logger.log('no items to insert in buffer; empty predicate\'s result');
25
- return NaN;
26
- }
27
- return found.$index;
28
- }
29
- insertVirtual(items, index, direction) {
30
- if (!items.length) {
31
- this.logger.log('no items to insert virtually; empty list');
32
- return false;
33
- }
34
- const { firstIndex, lastIndex, finiteAbsMinIndex, finiteAbsMaxIndex } = this.context;
35
- if (index < finiteAbsMinIndex || index > finiteAbsMaxIndex) {
36
- this.logger.log(() => 'no items to insert virtually; ' +
37
- `selected index (${index}) does not match virtual area [${finiteAbsMinIndex}..${finiteAbsMaxIndex}]`);
38
- return false;
39
- }
40
- const before = direction === Direction.backward;
41
- if (!(index < firstIndex + (before ? 1 : 0) || index > lastIndex - (before ? 0 : 1))) {
42
- this.logger.log(() => `no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`);
43
- return false;
44
- }
45
- this.logger.log(() => `going to insert ${items.length} item(s) virtually`);
46
- return true;
47
- }
48
- }
1
+ import { Direction } from '../../inputs/index';
2
+ export class CheckBufferCall {
3
+ constructor(context, logger) {
4
+ this.context = context;
5
+ this.logger = logger;
6
+ }
7
+ fillEmpty(items, before, after) {
8
+ if (!items.length) {
9
+ this.logger.log('no items to fill the buffer; empty list');
10
+ return false;
11
+ }
12
+ if (!Number.isInteger(before) && !Number.isInteger(after)) {
13
+ this.logger.log('no items to fill the buffer; wrong indexes');
14
+ return false;
15
+ }
16
+ this.logger.log(() => `going to fill the buffer with ${items.length} item(s)`);
17
+ return true;
18
+ }
19
+ insertInBuffer(predicate, before, after) {
20
+ const index = Number.isInteger(before) ? before : (Number.isInteger(after) ? after : NaN);
21
+ const found = this.context.items.find(item => (predicate && predicate(item.get())) ||
22
+ (Number.isInteger(index) && index === item.$index));
23
+ if (!found) {
24
+ this.logger.log('no items to insert in buffer; empty predicate\'s result');
25
+ return NaN;
26
+ }
27
+ return found.$index;
28
+ }
29
+ insertVirtual(items, index, direction) {
30
+ if (!items.length) {
31
+ this.logger.log('no items to insert virtually; empty list');
32
+ return false;
33
+ }
34
+ const { firstIndex, lastIndex, finiteAbsMinIndex, finiteAbsMaxIndex } = this.context;
35
+ if (index < finiteAbsMinIndex || index > finiteAbsMaxIndex) {
36
+ this.logger.log(() => 'no items to insert virtually; ' +
37
+ `selected index (${index}) does not match virtual area [${finiteAbsMinIndex}..${finiteAbsMaxIndex}]`);
38
+ return false;
39
+ }
40
+ const before = direction === Direction.backward;
41
+ if (!(index < firstIndex + (before ? 1 : 0) || index > lastIndex - (before ? 0 : 1))) {
42
+ this.logger.log(() => `no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`);
43
+ return false;
44
+ }
45
+ this.logger.log(() => `going to insert ${items.length} item(s) virtually`);
46
+ return true;
47
+ }
48
+ }
49
49
  //# sourceMappingURL=checkCall.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkCall.js","sourceRoot":"","sources":["../../../../src/classes/buffer/checkCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from '../buffer';\r\nimport { Logger } from '../logger';\r\nimport { Direction } from '../../inputs/index';\r\nimport { ItemsPredicate } from '../../interfaces/index';\r\n\r\nexport class CheckBufferCall<Data> {\r\n private context: Buffer<Data>;\r\n private logger: Logger;\r\n\r\n constructor(context: Buffer<Data>, logger: Logger) {\r\n this.context = context;\r\n this.logger = logger;\r\n }\r\n\r\n fillEmpty(items: Data[], before?: number, after?: number): boolean {\r\n if (!items.length) {\r\n this.logger.log('no items to fill the buffer; empty list');\r\n return false;\r\n }\r\n if (!Number.isInteger(before) && !Number.isInteger(after)) {\r\n this.logger.log('no items to fill the buffer; wrong indexes');\r\n return false;\r\n }\r\n this.logger.log(() => `going to fill the buffer with ${items.length} item(s)`);\r\n return true;\r\n }\r\n\r\n insertInBuffer(predicate?: ItemsPredicate, before?: number, after?: number): number {\r\n const index = Number.isInteger(before) ? before : (Number.isInteger(after) ? after : NaN);\r\n const found = this.context.items.find(item =>\r\n (predicate && predicate(item.get())) ||\r\n (Number.isInteger(index) && index === item.$index)\r\n );\r\n if (!found) {\r\n this.logger.log('no items to insert in buffer; empty predicate\\'s result');\r\n return NaN;\r\n }\r\n return found.$index;\r\n }\r\n\r\n insertVirtual(items: Data[], index: number, direction: Direction): boolean {\r\n if (!items.length) {\r\n this.logger.log('no items to insert virtually; empty list');\r\n return false;\r\n }\r\n const { firstIndex, lastIndex, finiteAbsMinIndex, finiteAbsMaxIndex } = this.context;\r\n if (index < finiteAbsMinIndex || index > finiteAbsMaxIndex) {\r\n this.logger.log(() =>\r\n 'no items to insert virtually; ' +\r\n `selected index (${index}) does not match virtual area [${finiteAbsMinIndex}..${finiteAbsMaxIndex}]`\r\n );\r\n return false;\r\n }\r\n const before = direction === Direction.backward;\r\n if (!(index < firstIndex + (before ? 1 : 0) || index > lastIndex - (before ? 0 : 1))) {\r\n this.logger.log(() =>\r\n `no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`\r\n );\r\n return false;\r\n }\r\n this.logger.log(() => `going to insert ${items.length} item(s) virtually`);\r\n return true;\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"checkCall.js","sourceRoot":"","sources":["../../../../src/classes/buffer/checkCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from '../buffer';\r\nimport { Logger } from '../logger';\r\nimport { Direction } from '../../inputs/index';\r\nimport { ItemsPredicate } from '../../interfaces/index';\r\n\r\nexport class CheckBufferCall<Data> {\r\n private context: Buffer<Data>;\r\n private logger: Logger;\r\n\r\n constructor(context: Buffer<Data>, logger: Logger) {\r\n this.context = context;\r\n this.logger = logger;\r\n }\r\n\r\n fillEmpty(items: Data[], before?: number, after?: number): boolean {\r\n if (!items.length) {\r\n this.logger.log('no items to fill the buffer; empty list');\r\n return false;\r\n }\r\n if (!Number.isInteger(before) && !Number.isInteger(after)) {\r\n this.logger.log('no items to fill the buffer; wrong indexes');\r\n return false;\r\n }\r\n this.logger.log(() => `going to fill the buffer with ${items.length} item(s)`);\r\n return true;\r\n }\r\n\r\n insertInBuffer(predicate?: ItemsPredicate, before?: number, after?: number): number {\r\n const index = Number.isInteger(before) ? before : (Number.isInteger(after) ? after : NaN);\r\n const found = this.context.items.find(item =>\r\n (predicate && predicate(item.get())) ||\r\n (Number.isInteger(index) && index === item.$index)\r\n );\r\n if (!found) {\r\n this.logger.log('no items to insert in buffer; empty predicate\\'s result');\r\n return NaN;\r\n }\r\n return found.$index;\r\n }\r\n\r\n insertVirtual(items: Data[], index: number, direction: Direction): boolean {\r\n if (!items.length) {\r\n this.logger.log('no items to insert virtually; empty list');\r\n return false;\r\n }\r\n const { firstIndex, lastIndex, finiteAbsMinIndex, finiteAbsMaxIndex } = this.context;\r\n if (index < finiteAbsMinIndex || index > finiteAbsMaxIndex) {\r\n this.logger.log(() =>\r\n 'no items to insert virtually; ' +\r\n `selected index (${index}) does not match virtual area [${finiteAbsMinIndex}..${finiteAbsMaxIndex}]`\r\n );\r\n return false;\r\n }\r\n const before = direction === Direction.backward;\r\n if (!(index < firstIndex + (before ? 1 : 0) || index > lastIndex - (before ? 0 : 1))) {\r\n this.logger.log(() =>\r\n `no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`\r\n );\r\n return false;\r\n }\r\n this.logger.log(() => `going to insert ${items.length} item(s) virtually`);\r\n return true;\r\n }\r\n\r\n}\r\n"]}
@@ -1,128 +1,128 @@
1
- import { SizeStrategy } from '../../inputs/index';
2
- export class SizesRecalculation {
3
- constructor() {
4
- this.reset();
5
- }
6
- reset() {
7
- this.newItems = [];
8
- this.oldItems = [];
9
- this.removed = [];
10
- }
11
- }
12
- export class DefaultSize {
13
- constructor(itemSize, sizeStrategy) {
14
- this.itemSize = itemSize;
15
- this.sizeStrategy = sizeStrategy;
16
- this.sizeMap = new Map();
17
- this.recalculation = new SizesRecalculation();
18
- }
19
- reset(force) {
20
- if (force) {
21
- this.constantSize = this.itemSize;
22
- this.frequentSize = this.itemSize;
23
- this.averageSize = this.itemSize;
24
- this.averageSizeFloat = this.itemSize;
25
- this.sizeMap.clear();
26
- }
27
- this.recalculation.reset();
28
- }
29
- get() {
30
- switch (this.sizeStrategy) {
31
- case SizeStrategy.Average:
32
- return this.averageSize;
33
- case SizeStrategy.Frequent:
34
- return this.frequentSize;
35
- default:
36
- return this.constantSize;
37
- }
38
- }
39
- recalculateAverageSize(cacheSize) {
40
- const { oldItems, newItems, removed } = this.recalculation;
41
- if (oldItems.length) {
42
- const oldSize = oldItems.reduce((acc, item) => acc + item.size, 0);
43
- const newSize = oldItems.reduce((acc, item) => acc + item.newSize, 0);
44
- const averageSize = this.averageSizeFloat || 0;
45
- this.averageSizeFloat = averageSize - (oldSize - newSize) / (cacheSize - newItems.length);
46
- }
47
- if (newItems.length) {
48
- const newSize = newItems.reduce((acc, item) => acc + item.size, 0);
49
- const averageSize = this.averageSizeFloat || 0;
50
- this.averageSizeFloat = ((cacheSize - newItems.length) * averageSize + newSize) / cacheSize;
51
- }
52
- if (removed.length) {
53
- const removedSize = removed.reduce((acc, item) => acc + item.size, 0);
54
- const averageSize = this.averageSizeFloat || 0;
55
- this.averageSizeFloat = ((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;
56
- }
57
- this.averageSize = Math.round(this.averageSizeFloat);
58
- }
59
- recalculateFrequentSize() {
60
- const { oldItems, newItems, removed } = this.recalculation;
61
- const oldFrequentSizeCount = this.sizeMap.get(this.frequentSize);
62
- if (newItems.length) {
63
- newItems.forEach(({ size }) => this.sizeMap.set(size, (this.sizeMap.get(size) || 0) + 1));
64
- }
65
- if (oldItems.length) {
66
- oldItems.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));
67
- oldItems.forEach(({ newSize: s }) => this.sizeMap.set(s, (this.sizeMap.get(s) || 0) + 1));
68
- }
69
- if (removed.length) {
70
- removed.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));
71
- }
72
- const sorted = [...this.sizeMap.entries()].sort((a, b) => b[1] - a[1]);
73
- const mostFrequentCount = sorted[0][1];
74
- const listEqual = sorted.filter(i => i[1] === mostFrequentCount);
75
- if (listEqual.length > 1 && listEqual.find(i => i[0] === oldFrequentSizeCount)) {
76
- // if there are more than 1 most frequent sizes, but the old one is present
77
- return;
78
- }
79
- this.frequentSize = sorted[0][0];
80
- }
81
- recalculate(cacheSize) {
82
- if (this.sizeStrategy === SizeStrategy.Constant) {
83
- return false;
84
- }
85
- const { oldItems, newItems, removed } = this.recalculation;
86
- if (!oldItems.length && !newItems.length && !removed.length) {
87
- return false;
88
- }
89
- const oldValue = this.get();
90
- if (!cacheSize) {
91
- this.reset(true);
92
- }
93
- else {
94
- if (this.sizeStrategy === SizeStrategy.Average) {
95
- this.recalculateAverageSize(cacheSize);
96
- }
97
- else {
98
- this.recalculateFrequentSize();
99
- }
100
- this.recalculation.reset();
101
- }
102
- return this.get() !== oldValue;
103
- }
104
- setExisted(oldSize, newSize) {
105
- if (this.sizeStrategy !== SizeStrategy.Constant) {
106
- this.recalculation.oldItems.push({
107
- size: oldSize,
108
- newSize
109
- });
110
- }
111
- }
112
- setNew(size) {
113
- if (this.sizeStrategy !== SizeStrategy.Constant) {
114
- this.recalculation.newItems.push({ size });
115
- }
116
- else {
117
- if (!this.constantSize) {
118
- this.constantSize = size;
119
- }
120
- }
121
- }
122
- setRemoved(size) {
123
- if (this.sizeStrategy !== SizeStrategy.Constant) {
124
- this.recalculation.removed.push({ size });
125
- }
126
- }
127
- }
1
+ import { SizeStrategy } from '../../inputs/index';
2
+ export class SizesRecalculation {
3
+ constructor() {
4
+ this.reset();
5
+ }
6
+ reset() {
7
+ this.newItems = [];
8
+ this.oldItems = [];
9
+ this.removed = [];
10
+ }
11
+ }
12
+ export class DefaultSize {
13
+ constructor(itemSize, sizeStrategy) {
14
+ this.itemSize = itemSize;
15
+ this.sizeStrategy = sizeStrategy;
16
+ this.sizeMap = new Map();
17
+ this.recalculation = new SizesRecalculation();
18
+ }
19
+ reset(force) {
20
+ if (force) {
21
+ this.constantSize = this.itemSize;
22
+ this.frequentSize = this.itemSize;
23
+ this.averageSize = this.itemSize;
24
+ this.averageSizeFloat = this.itemSize;
25
+ this.sizeMap.clear();
26
+ }
27
+ this.recalculation.reset();
28
+ }
29
+ get() {
30
+ switch (this.sizeStrategy) {
31
+ case SizeStrategy.Average:
32
+ return this.averageSize;
33
+ case SizeStrategy.Frequent:
34
+ return this.frequentSize;
35
+ default:
36
+ return this.constantSize;
37
+ }
38
+ }
39
+ recalculateAverageSize(cacheSize) {
40
+ const { oldItems, newItems, removed } = this.recalculation;
41
+ if (oldItems.length) {
42
+ const oldSize = oldItems.reduce((acc, item) => acc + item.size, 0);
43
+ const newSize = oldItems.reduce((acc, item) => acc + item.newSize, 0);
44
+ const averageSize = this.averageSizeFloat || 0;
45
+ this.averageSizeFloat = averageSize - (oldSize - newSize) / (cacheSize - newItems.length);
46
+ }
47
+ if (newItems.length) {
48
+ const newSize = newItems.reduce((acc, item) => acc + item.size, 0);
49
+ const averageSize = this.averageSizeFloat || 0;
50
+ this.averageSizeFloat = ((cacheSize - newItems.length) * averageSize + newSize) / cacheSize;
51
+ }
52
+ if (removed.length) {
53
+ const removedSize = removed.reduce((acc, item) => acc + item.size, 0);
54
+ const averageSize = this.averageSizeFloat || 0;
55
+ this.averageSizeFloat = ((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;
56
+ }
57
+ this.averageSize = Math.round(this.averageSizeFloat);
58
+ }
59
+ recalculateFrequentSize() {
60
+ const { oldItems, newItems, removed } = this.recalculation;
61
+ const oldFrequentSizeCount = this.sizeMap.get(this.frequentSize);
62
+ if (newItems.length) {
63
+ newItems.forEach(({ size }) => this.sizeMap.set(size, (this.sizeMap.get(size) || 0) + 1));
64
+ }
65
+ if (oldItems.length) {
66
+ oldItems.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));
67
+ oldItems.forEach(({ newSize: s }) => this.sizeMap.set(s, (this.sizeMap.get(s) || 0) + 1));
68
+ }
69
+ if (removed.length) {
70
+ removed.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));
71
+ }
72
+ const sorted = [...this.sizeMap.entries()].sort((a, b) => b[1] - a[1]);
73
+ const mostFrequentCount = sorted[0][1];
74
+ const listEqual = sorted.filter(i => i[1] === mostFrequentCount);
75
+ if (listEqual.length > 1 && listEqual.find(i => i[0] === oldFrequentSizeCount)) {
76
+ // if there are more than 1 most frequent sizes, but the old one is present
77
+ return;
78
+ }
79
+ this.frequentSize = sorted[0][0];
80
+ }
81
+ recalculate(cacheSize) {
82
+ if (this.sizeStrategy === SizeStrategy.Constant) {
83
+ return false;
84
+ }
85
+ const { oldItems, newItems, removed } = this.recalculation;
86
+ if (!oldItems.length && !newItems.length && !removed.length) {
87
+ return false;
88
+ }
89
+ const oldValue = this.get();
90
+ if (!cacheSize) {
91
+ this.reset(true);
92
+ }
93
+ else {
94
+ if (this.sizeStrategy === SizeStrategy.Average) {
95
+ this.recalculateAverageSize(cacheSize);
96
+ }
97
+ else {
98
+ this.recalculateFrequentSize();
99
+ }
100
+ this.recalculation.reset();
101
+ }
102
+ return this.get() !== oldValue;
103
+ }
104
+ setExisted(oldSize, newSize) {
105
+ if (this.sizeStrategy !== SizeStrategy.Constant) {
106
+ this.recalculation.oldItems.push({
107
+ size: oldSize,
108
+ newSize
109
+ });
110
+ }
111
+ }
112
+ setNew(size) {
113
+ if (this.sizeStrategy !== SizeStrategy.Constant) {
114
+ this.recalculation.newItems.push({ size });
115
+ }
116
+ else {
117
+ if (!this.constantSize) {
118
+ this.constantSize = size;
119
+ }
120
+ }
121
+ }
122
+ setRemoved(size) {
123
+ if (this.sizeStrategy !== SizeStrategy.Constant) {
124
+ this.recalculation.removed.push({ size });
125
+ }
126
+ }
127
+ }
128
128
  //# sourceMappingURL=defaultSize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultSize.js","sourceRoot":"","sources":["../../../../src/classes/buffer/defaultSize.ts"],"names":[],"mappings":"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","sourcesContent":["import { SizeStrategy } from '../../inputs/index';\r\n\r\ninterface ItemSize {\r\n size: number;\r\n newSize?: number;\r\n}\r\n\r\nexport class SizesRecalculation {\r\n newItems: ItemSize[];\r\n oldItems: ItemSize[];\r\n removed: ItemSize[];\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset(): void {\r\n this.newItems = [];\r\n this.oldItems = [];\r\n this.removed = [];\r\n }\r\n}\r\n\r\nexport class DefaultSize {\r\n private readonly itemSize: number;\r\n private readonly sizeStrategy: SizeStrategy;\r\n private sizeMap: Map<number, number>;\r\n private recalculation: SizesRecalculation;\r\n\r\n private constantSize: number;\r\n private frequentSize: number;\r\n private averageSize: number;\r\n private averageSizeFloat: number;\r\n\r\n constructor(itemSize: number, sizeStrategy: SizeStrategy) {\r\n this.itemSize = itemSize;\r\n this.sizeStrategy = sizeStrategy;\r\n this.sizeMap = new Map<number, number>();\r\n this.recalculation = new SizesRecalculation();\r\n }\r\n\r\n reset(force: boolean): void {\r\n if (force) {\r\n this.constantSize = this.itemSize;\r\n this.frequentSize = this.itemSize;\r\n this.averageSize = this.itemSize;\r\n this.averageSizeFloat = this.itemSize;\r\n this.sizeMap.clear();\r\n }\r\n this.recalculation.reset();\r\n }\r\n\r\n get(): number {\r\n switch (this.sizeStrategy) {\r\n case SizeStrategy.Average:\r\n return this.averageSize;\r\n case SizeStrategy.Frequent:\r\n return this.frequentSize;\r\n default:\r\n return this.constantSize;\r\n }\r\n }\r\n\r\n private recalculateAverageSize(cacheSize: number): void {\r\n const { oldItems, newItems, removed } = this.recalculation;\r\n if (oldItems.length) {\r\n const oldSize = oldItems.reduce((acc, item) => acc + item.size, 0);\r\n const newSize = oldItems.reduce((acc, item) => acc + (item.newSize as number), 0);\r\n const averageSize = this.averageSizeFloat || 0;\r\n this.averageSizeFloat = averageSize - (oldSize - newSize) / (cacheSize - newItems.length);\r\n }\r\n if (newItems.length) {\r\n const newSize = newItems.reduce((acc, item) => acc + item.size, 0);\r\n const averageSize = this.averageSizeFloat || 0;\r\n this.averageSizeFloat = ((cacheSize - newItems.length) * averageSize + newSize) / cacheSize;\r\n }\r\n if (removed.length) {\r\n const removedSize = removed.reduce((acc, item) => acc + item.size, 0);\r\n const averageSize = this.averageSizeFloat || 0;\r\n this.averageSizeFloat = ((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;\r\n }\r\n this.averageSize = Math.round(this.averageSizeFloat);\r\n }\r\n\r\n private recalculateFrequentSize(): void {\r\n const { oldItems, newItems, removed } = this.recalculation;\r\n const oldFrequentSizeCount = this.sizeMap.get(this.frequentSize);\r\n if (newItems.length) {\r\n newItems.forEach(({ size }) => this.sizeMap.set(size, (this.sizeMap.get(size) || 0) + 1));\r\n }\r\n if (oldItems.length) {\r\n oldItems.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));\r\n oldItems.forEach(({ newSize: s }) => this.sizeMap.set(s as number, (this.sizeMap.get(s as number) || 0) + 1));\r\n }\r\n if (removed.length) {\r\n removed.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));\r\n }\r\n const sorted = [...this.sizeMap.entries()].sort((a, b) => b[1] - a[1]);\r\n const mostFrequentCount = sorted[0][1];\r\n const listEqual = sorted.filter(i => i[1] === mostFrequentCount);\r\n if (listEqual.length > 1 && listEqual.find(i => i[0] === oldFrequentSizeCount)) {\r\n // if there are more than 1 most frequent sizes, but the old one is present\r\n return;\r\n }\r\n this.frequentSize = sorted[0][0];\r\n }\r\n\r\n recalculate(cacheSize: number): boolean {\r\n if (this.sizeStrategy === SizeStrategy.Constant) {\r\n return false;\r\n }\r\n const { oldItems, newItems, removed } = this.recalculation;\r\n if (!oldItems.length && !newItems.length && !removed.length) {\r\n return false;\r\n }\r\n const oldValue = this.get();\r\n if (!cacheSize) {\r\n this.reset(true);\r\n } else {\r\n if (this.sizeStrategy === SizeStrategy.Average) {\r\n this.recalculateAverageSize(cacheSize);\r\n } else {\r\n this.recalculateFrequentSize();\r\n }\r\n this.recalculation.reset();\r\n }\r\n return this.get() !== oldValue;\r\n }\r\n\r\n setExisted(oldSize: number, newSize: number): void {\r\n if (this.sizeStrategy !== SizeStrategy.Constant) {\r\n this.recalculation.oldItems.push({\r\n size: oldSize,\r\n newSize\r\n });\r\n }\r\n }\r\n\r\n setNew(size: number): void {\r\n if (this.sizeStrategy !== SizeStrategy.Constant) {\r\n this.recalculation.newItems.push({ size });\r\n } else {\r\n if (!this.constantSize) {\r\n this.constantSize = size;\r\n }\r\n }\r\n }\r\n\r\n setRemoved(size: number): void {\r\n if (this.sizeStrategy !== SizeStrategy.Constant) {\r\n this.recalculation.removed.push({ size });\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"defaultSize.js","sourceRoot":"","sources":["../../../../src/classes/buffer/defaultSize.ts"],"names":[],"mappings":"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","sourcesContent":["import { SizeStrategy } from '../../inputs/index';\r\n\r\ninterface ItemSize {\r\n size: number;\r\n newSize?: number;\r\n}\r\n\r\nexport class SizesRecalculation {\r\n newItems: ItemSize[];\r\n oldItems: ItemSize[];\r\n removed: ItemSize[];\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset(): void {\r\n this.newItems = [];\r\n this.oldItems = [];\r\n this.removed = [];\r\n }\r\n}\r\n\r\nexport class DefaultSize {\r\n private readonly itemSize: number;\r\n private readonly sizeStrategy: SizeStrategy;\r\n private sizeMap: Map<number, number>;\r\n private recalculation: SizesRecalculation;\r\n\r\n private constantSize: number;\r\n private frequentSize: number;\r\n private averageSize: number;\r\n private averageSizeFloat: number;\r\n\r\n constructor(itemSize: number, sizeStrategy: SizeStrategy) {\r\n this.itemSize = itemSize;\r\n this.sizeStrategy = sizeStrategy;\r\n this.sizeMap = new Map<number, number>();\r\n this.recalculation = new SizesRecalculation();\r\n }\r\n\r\n reset(force: boolean): void {\r\n if (force) {\r\n this.constantSize = this.itemSize;\r\n this.frequentSize = this.itemSize;\r\n this.averageSize = this.itemSize;\r\n this.averageSizeFloat = this.itemSize;\r\n this.sizeMap.clear();\r\n }\r\n this.recalculation.reset();\r\n }\r\n\r\n get(): number {\r\n switch (this.sizeStrategy) {\r\n case SizeStrategy.Average:\r\n return this.averageSize;\r\n case SizeStrategy.Frequent:\r\n return this.frequentSize;\r\n default:\r\n return this.constantSize;\r\n }\r\n }\r\n\r\n private recalculateAverageSize(cacheSize: number): void {\r\n const { oldItems, newItems, removed } = this.recalculation;\r\n if (oldItems.length) {\r\n const oldSize = oldItems.reduce((acc, item) => acc + item.size, 0);\r\n const newSize = oldItems.reduce((acc, item) => acc + (item.newSize as number), 0);\r\n const averageSize = this.averageSizeFloat || 0;\r\n this.averageSizeFloat = averageSize - (oldSize - newSize) / (cacheSize - newItems.length);\r\n }\r\n if (newItems.length) {\r\n const newSize = newItems.reduce((acc, item) => acc + item.size, 0);\r\n const averageSize = this.averageSizeFloat || 0;\r\n this.averageSizeFloat = ((cacheSize - newItems.length) * averageSize + newSize) / cacheSize;\r\n }\r\n if (removed.length) {\r\n const removedSize = removed.reduce((acc, item) => acc + item.size, 0);\r\n const averageSize = this.averageSizeFloat || 0;\r\n this.averageSizeFloat = ((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;\r\n }\r\n this.averageSize = Math.round(this.averageSizeFloat);\r\n }\r\n\r\n private recalculateFrequentSize(): void {\r\n const { oldItems, newItems, removed } = this.recalculation;\r\n const oldFrequentSizeCount = this.sizeMap.get(this.frequentSize);\r\n if (newItems.length) {\r\n newItems.forEach(({ size }) => this.sizeMap.set(size, (this.sizeMap.get(size) || 0) + 1));\r\n }\r\n if (oldItems.length) {\r\n oldItems.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));\r\n oldItems.forEach(({ newSize: s }) => this.sizeMap.set(s as number, (this.sizeMap.get(s as number) || 0) + 1));\r\n }\r\n if (removed.length) {\r\n removed.forEach(({ size }) => this.sizeMap.set(size, Math.max((this.sizeMap.get(size) || 0) - 1, 0)));\r\n }\r\n const sorted = [...this.sizeMap.entries()].sort((a, b) => b[1] - a[1]);\r\n const mostFrequentCount = sorted[0][1];\r\n const listEqual = sorted.filter(i => i[1] === mostFrequentCount);\r\n if (listEqual.length > 1 && listEqual.find(i => i[0] === oldFrequentSizeCount)) {\r\n // if there are more than 1 most frequent sizes, but the old one is present\r\n return;\r\n }\r\n this.frequentSize = sorted[0][0];\r\n }\r\n\r\n recalculate(cacheSize: number): boolean {\r\n if (this.sizeStrategy === SizeStrategy.Constant) {\r\n return false;\r\n }\r\n const { oldItems, newItems, removed } = this.recalculation;\r\n if (!oldItems.length && !newItems.length && !removed.length) {\r\n return false;\r\n }\r\n const oldValue = this.get();\r\n if (!cacheSize) {\r\n this.reset(true);\r\n } else {\r\n if (this.sizeStrategy === SizeStrategy.Average) {\r\n this.recalculateAverageSize(cacheSize);\r\n } else {\r\n this.recalculateFrequentSize();\r\n }\r\n this.recalculation.reset();\r\n }\r\n return this.get() !== oldValue;\r\n }\r\n\r\n setExisted(oldSize: number, newSize: number): void {\r\n if (this.sizeStrategy !== SizeStrategy.Constant) {\r\n this.recalculation.oldItems.push({\r\n size: oldSize,\r\n newSize\r\n });\r\n }\r\n }\r\n\r\n setNew(size: number): void {\r\n if (this.sizeStrategy !== SizeStrategy.Constant) {\r\n this.recalculation.newItems.push({ size });\r\n } else {\r\n if (!this.constantSize) {\r\n this.constantSize = size;\r\n }\r\n }\r\n }\r\n\r\n setRemoved(size: number): void {\r\n if (this.sizeStrategy !== SizeStrategy.Constant) {\r\n this.recalculation.removed.push({ size });\r\n }\r\n }\r\n}\r\n"]}