vscroll 1.5.3 → 1.5.4

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 (335) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +283 -273
  3. package/dist/bundles/vscroll.esm5.js +5553 -5525
  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 +5040 -5015
  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 +5554 -5526
  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 +268 -268
  18. package/dist/esm2015/classes/adapter/props.js.map +1 -1
  19. package/dist/esm2015/classes/adapter/wanted.js +28 -28
  20. package/dist/esm2015/classes/adapter/wanted.js.map +1 -1
  21. package/dist/esm2015/classes/adapter.js +455 -442
  22. package/dist/esm2015/classes/adapter.js.map +1 -1
  23. package/dist/esm2015/classes/buffer/cache.js +246 -246
  24. package/dist/esm2015/classes/buffer/cache.js.map +1 -1
  25. package/dist/esm2015/classes/buffer/checkCall.js +48 -48
  26. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  27. package/dist/esm2015/classes/buffer/defaultSize.js +127 -127
  28. package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
  29. package/dist/esm2015/classes/buffer.js +342 -342
  30. package/dist/esm2015/classes/buffer.js.map +1 -1
  31. package/dist/esm2015/classes/datasource.js +28 -28
  32. package/dist/esm2015/classes/domRoutines.js +166 -166
  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/reactive.js +54 -54
  40. package/dist/esm2015/classes/reactive.js.map +1 -1
  41. package/dist/esm2015/classes/settings.js +39 -39
  42. package/dist/esm2015/classes/settings.js.map +1 -1
  43. package/dist/esm2015/classes/state/clip.js +16 -16
  44. package/dist/esm2015/classes/state/clip.js.map +1 -1
  45. package/dist/esm2015/classes/state/cycle.js +60 -60
  46. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  47. package/dist/esm2015/classes/state/fetch.js +122 -122
  48. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  49. package/dist/esm2015/classes/state/render.js +14 -14
  50. package/dist/esm2015/classes/state/render.js.map +1 -1
  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 +59 -59
  54. package/dist/esm2015/classes/viewport.js +72 -72
  55. package/dist/esm2015/classes/viewport.js.map +1 -1
  56. package/dist/esm2015/index.js +8 -8
  57. package/dist/esm2015/index.js.map +1 -1
  58. package/dist/esm2015/inputs/adapter.js +230 -230
  59. package/dist/esm2015/inputs/adapter.js.map +1 -1
  60. package/dist/esm2015/inputs/common.js +11 -11
  61. package/dist/esm2015/inputs/common.js.map +1 -1
  62. package/dist/esm2015/inputs/datasource.js +20 -20
  63. package/dist/esm2015/inputs/datasource.js.map +1 -1
  64. package/dist/esm2015/inputs/index.js +6 -6
  65. package/dist/esm2015/inputs/index.js.map +1 -1
  66. package/dist/esm2015/inputs/settings.js +146 -146
  67. package/dist/esm2015/inputs/settings.js.map +1 -1
  68. package/dist/esm2015/inputs/validation.js +374 -374
  69. package/dist/esm2015/inputs/validation.js.map +1 -1
  70. package/dist/esm2015/interfaces/adapter.js +1 -1
  71. package/dist/esm2015/interfaces/datasource.js +1 -1
  72. package/dist/esm2015/interfaces/datasource.js.map +1 -1
  73. package/dist/esm2015/interfaces/index.js +1 -1
  74. package/dist/esm2015/interfaces/index.js.map +1 -1
  75. package/dist/esm2015/interfaces/item.js +1 -1
  76. package/dist/esm2015/interfaces/item.js.map +1 -1
  77. package/dist/esm2015/interfaces/process.js +1 -1
  78. package/dist/esm2015/interfaces/routines.js +1 -1
  79. package/dist/esm2015/interfaces/routines.js.map +1 -1
  80. package/dist/esm2015/interfaces/settings.js +1 -1
  81. package/dist/esm2015/interfaces/state.js +1 -1
  82. package/dist/esm2015/interfaces/validation.js +1 -1
  83. package/dist/esm2015/interfaces/validation.js.map +1 -1
  84. package/dist/esm2015/interfaces/workflow.js +1 -1
  85. package/dist/esm2015/interfaces/workflow.js.map +1 -1
  86. package/dist/esm2015/processes/adapter/append.js +35 -35
  87. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  88. package/dist/esm2015/processes/adapter/check.js +32 -32
  89. package/dist/esm2015/processes/adapter/check.js.map +1 -1
  90. package/dist/esm2015/processes/adapter/clip.js +12 -12
  91. package/dist/esm2015/processes/adapter/clip.js.map +1 -1
  92. package/dist/esm2015/processes/adapter/fix.js +77 -77
  93. package/dist/esm2015/processes/adapter/fix.js.map +1 -1
  94. package/dist/esm2015/processes/adapter/insert.js +73 -73
  95. package/dist/esm2015/processes/adapter/insert.js.map +1 -1
  96. package/dist/esm2015/processes/adapter/reload.js +19 -20
  97. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  98. package/dist/esm2015/processes/adapter/remove.js +102 -102
  99. package/dist/esm2015/processes/adapter/remove.js.map +1 -1
  100. package/dist/esm2015/processes/adapter/replace.js +39 -39
  101. package/dist/esm2015/processes/adapter/replace.js.map +1 -1
  102. package/dist/esm2015/processes/adapter/reset.js +35 -35
  103. package/dist/esm2015/processes/adapter/reset.js.map +1 -1
  104. package/dist/esm2015/processes/adapter/update.js +43 -43
  105. package/dist/esm2015/processes/adapter/update.js.map +1 -1
  106. package/dist/esm2015/processes/adjust.js +141 -141
  107. package/dist/esm2015/processes/clip.js +49 -49
  108. package/dist/esm2015/processes/end.js +52 -52
  109. package/dist/esm2015/processes/end.js.map +1 -1
  110. package/dist/esm2015/processes/fetch.js +90 -90
  111. package/dist/esm2015/processes/fetch.js.map +1 -1
  112. package/dist/esm2015/processes/index.js +23 -23
  113. package/dist/esm2015/processes/init.js +14 -14
  114. package/dist/esm2015/processes/init.js.map +1 -1
  115. package/dist/esm2015/processes/misc/base.js +30 -30
  116. package/dist/esm2015/processes/misc/base.js.map +1 -1
  117. package/dist/esm2015/processes/misc/enums.js +35 -35
  118. package/dist/esm2015/processes/misc/enums.js.map +1 -1
  119. package/dist/esm2015/processes/misc/index.js +2 -2
  120. package/dist/esm2015/processes/misc/index.js.map +1 -1
  121. package/dist/esm2015/processes/postFetch.js +64 -64
  122. package/dist/esm2015/processes/postFetch.js.map +1 -1
  123. package/dist/esm2015/processes/preClip.js +85 -85
  124. package/dist/esm2015/processes/preClip.js.map +1 -1
  125. package/dist/esm2015/processes/preFetch.js +240 -240
  126. package/dist/esm2015/processes/preFetch.js.map +1 -1
  127. package/dist/esm2015/processes/render.js +54 -54
  128. package/dist/esm2015/processes/render.js.map +1 -1
  129. package/dist/esm2015/processes/scroll.js +97 -97
  130. package/dist/esm2015/processes/scroll.js.map +1 -1
  131. package/dist/esm2015/processes/start.js +11 -11
  132. package/dist/esm2015/processes/start.js.map +1 -1
  133. package/dist/esm2015/scroller.js +75 -69
  134. package/dist/esm2015/scroller.js.map +1 -1
  135. package/dist/esm2015/version.js +4 -4
  136. package/dist/esm2015/version.js.map +1 -1
  137. package/dist/esm2015/workflow-transducer.js +210 -210
  138. package/dist/esm2015/workflow-transducer.js.map +1 -1
  139. package/dist/esm2015/workflow.js +158 -151
  140. package/dist/esm2015/workflow.js.map +1 -1
  141. package/dist/esm5/classes/adapter/context.js +50 -50
  142. package/dist/esm5/classes/adapter/context.js.map +1 -1
  143. package/dist/esm5/classes/adapter/props.js +268 -268
  144. package/dist/esm5/classes/adapter/props.js.map +1 -1
  145. package/dist/esm5/classes/adapter/wanted.js +29 -29
  146. package/dist/esm5/classes/adapter/wanted.js.map +1 -1
  147. package/dist/esm5/classes/adapter.js +504 -490
  148. package/dist/esm5/classes/adapter.js.map +1 -1
  149. package/dist/esm5/classes/buffer/cache.js +260 -260
  150. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  151. package/dist/esm5/classes/buffer/checkCall.js +56 -56
  152. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  153. package/dist/esm5/classes/buffer/defaultSize.js +145 -145
  154. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  155. package/dist/esm5/classes/buffer.js +409 -409
  156. package/dist/esm5/classes/buffer.js.map +1 -1
  157. package/dist/esm5/classes/datasource.js +37 -37
  158. package/dist/esm5/classes/domRoutines.js +182 -182
  159. package/dist/esm5/classes/domRoutines.js.map +1 -1
  160. package/dist/esm5/classes/item.js +76 -76
  161. package/dist/esm5/classes/item.js.map +1 -1
  162. package/dist/esm5/classes/logger.js +210 -210
  163. package/dist/esm5/classes/logger.js.map +1 -1
  164. package/dist/esm5/classes/paddings.js +80 -80
  165. package/dist/esm5/classes/reactive.js +69 -69
  166. package/dist/esm5/classes/reactive.js.map +1 -1
  167. package/dist/esm5/classes/settings.js +47 -47
  168. package/dist/esm5/classes/settings.js.map +1 -1
  169. package/dist/esm5/classes/state/clip.js +22 -22
  170. package/dist/esm5/classes/state/clip.js.map +1 -1
  171. package/dist/esm5/classes/state/cycle.js +75 -75
  172. package/dist/esm5/classes/state/cycle.js.map +1 -1
  173. package/dist/esm5/classes/state/fetch.js +148 -148
  174. package/dist/esm5/classes/state/fetch.js.map +1 -1
  175. package/dist/esm5/classes/state/render.js +20 -20
  176. package/dist/esm5/classes/state/render.js.map +1 -1
  177. package/dist/esm5/classes/state/scroll.js +32 -32
  178. package/dist/esm5/classes/state/scroll.js.map +1 -1
  179. package/dist/esm5/classes/state.js +66 -66
  180. package/dist/esm5/classes/viewport.js +79 -79
  181. package/dist/esm5/classes/viewport.js.map +1 -1
  182. package/dist/esm5/index.js +8 -8
  183. package/dist/esm5/index.js.map +1 -1
  184. package/dist/esm5/inputs/adapter.js +231 -231
  185. package/dist/esm5/inputs/adapter.js.map +1 -1
  186. package/dist/esm5/inputs/common.js +11 -11
  187. package/dist/esm5/inputs/common.js.map +1 -1
  188. package/dist/esm5/inputs/datasource.js +21 -21
  189. package/dist/esm5/inputs/datasource.js.map +1 -1
  190. package/dist/esm5/inputs/index.js +6 -6
  191. package/dist/esm5/inputs/index.js.map +1 -1
  192. package/dist/esm5/inputs/settings.js +147 -147
  193. package/dist/esm5/inputs/settings.js.map +1 -1
  194. package/dist/esm5/inputs/validation.js +396 -396
  195. package/dist/esm5/inputs/validation.js.map +1 -1
  196. package/dist/esm5/interfaces/adapter.js +1 -1
  197. package/dist/esm5/interfaces/datasource.js +1 -1
  198. package/dist/esm5/interfaces/datasource.js.map +1 -1
  199. package/dist/esm5/interfaces/index.js +1 -1
  200. package/dist/esm5/interfaces/index.js.map +1 -1
  201. package/dist/esm5/interfaces/item.js +1 -1
  202. package/dist/esm5/interfaces/item.js.map +1 -1
  203. package/dist/esm5/interfaces/process.js +1 -1
  204. package/dist/esm5/interfaces/routines.js +1 -1
  205. package/dist/esm5/interfaces/routines.js.map +1 -1
  206. package/dist/esm5/interfaces/settings.js +1 -1
  207. package/dist/esm5/interfaces/state.js +1 -1
  208. package/dist/esm5/interfaces/validation.js +1 -1
  209. package/dist/esm5/interfaces/validation.js.map +1 -1
  210. package/dist/esm5/interfaces/workflow.js +1 -1
  211. package/dist/esm5/interfaces/workflow.js.map +1 -1
  212. package/dist/esm5/processes/adapter/append.js +43 -43
  213. package/dist/esm5/processes/adapter/append.js.map +1 -1
  214. package/dist/esm5/processes/adapter/check.js +39 -39
  215. package/dist/esm5/processes/adapter/check.js.map +1 -1
  216. package/dist/esm5/processes/adapter/clip.js +19 -19
  217. package/dist/esm5/processes/adapter/clip.js.map +1 -1
  218. package/dist/esm5/processes/adapter/fix.js +89 -89
  219. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  220. package/dist/esm5/processes/adapter/insert.js +81 -81
  221. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  222. package/dist/esm5/processes/adapter/reload.js +26 -27
  223. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  224. package/dist/esm5/processes/adapter/remove.js +115 -115
  225. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  226. package/dist/esm5/processes/adapter/replace.js +47 -47
  227. package/dist/esm5/processes/adapter/replace.js.map +1 -1
  228. package/dist/esm5/processes/adapter/reset.js +42 -42
  229. package/dist/esm5/processes/adapter/reset.js.map +1 -1
  230. package/dist/esm5/processes/adapter/update.js +59 -59
  231. package/dist/esm5/processes/adapter/update.js.map +1 -1
  232. package/dist/esm5/processes/adjust.js +152 -152
  233. package/dist/esm5/processes/clip.js +60 -60
  234. package/dist/esm5/processes/end.js +63 -63
  235. package/dist/esm5/processes/end.js.map +1 -1
  236. package/dist/esm5/processes/fetch.js +101 -101
  237. package/dist/esm5/processes/fetch.js.map +1 -1
  238. package/dist/esm5/processes/index.js +23 -23
  239. package/dist/esm5/processes/init.js +21 -21
  240. package/dist/esm5/processes/init.js.map +1 -1
  241. package/dist/esm5/processes/misc/base.js +44 -44
  242. package/dist/esm5/processes/misc/base.js.map +1 -1
  243. package/dist/esm5/processes/misc/enums.js +35 -35
  244. package/dist/esm5/processes/misc/enums.js.map +1 -1
  245. package/dist/esm5/processes/misc/index.js +2 -2
  246. package/dist/esm5/processes/misc/index.js.map +1 -1
  247. package/dist/esm5/processes/postFetch.js +73 -73
  248. package/dist/esm5/processes/postFetch.js.map +1 -1
  249. package/dist/esm5/processes/preClip.js +94 -94
  250. package/dist/esm5/processes/preClip.js.map +1 -1
  251. package/dist/esm5/processes/preFetch.js +247 -247
  252. package/dist/esm5/processes/preFetch.js.map +1 -1
  253. package/dist/esm5/processes/render.js +63 -63
  254. package/dist/esm5/processes/render.js.map +1 -1
  255. package/dist/esm5/processes/scroll.js +107 -107
  256. package/dist/esm5/processes/scroll.js.map +1 -1
  257. package/dist/esm5/processes/start.js +18 -18
  258. package/dist/esm5/processes/start.js.map +1 -1
  259. package/dist/esm5/scroller.js +81 -73
  260. package/dist/esm5/scroller.js.map +1 -1
  261. package/dist/esm5/version.js +4 -4
  262. package/dist/esm5/version.js.map +1 -1
  263. package/dist/esm5/workflow-transducer.js +212 -212
  264. package/dist/esm5/workflow-transducer.js.map +1 -1
  265. package/dist/esm5/workflow.js +183 -176
  266. package/dist/esm5/workflow.js.map +1 -1
  267. package/dist/typings/classes/adapter/context.d.ts +4 -4
  268. package/dist/typings/classes/adapter/props.d.ts +47 -47
  269. package/dist/typings/classes/adapter/wanted.d.ts +14 -14
  270. package/dist/typings/classes/adapter.d.ts +74 -64
  271. package/dist/typings/classes/buffer/cache.d.ts +95 -95
  272. package/dist/typings/classes/buffer/checkCall.d.ts +12 -12
  273. package/dist/typings/classes/buffer/defaultSize.d.ts +32 -32
  274. package/dist/typings/classes/buffer.d.ts +64 -64
  275. package/dist/typings/classes/datasource.d.ts +27 -27
  276. package/dist/typings/classes/domRoutines.d.ts +33 -33
  277. package/dist/typings/classes/item.d.ts +28 -28
  278. package/dist/typings/classes/logger.d.ts +28 -28
  279. package/dist/typings/classes/paddings.d.ts +22 -22
  280. package/dist/typings/classes/reactive.d.ts +21 -21
  281. package/dist/typings/classes/settings.d.ts +119 -119
  282. package/dist/typings/classes/state/clip.d.ts +9 -9
  283. package/dist/typings/classes/state/cycle.d.ts +29 -29
  284. package/dist/typings/classes/state/fetch.d.ts +62 -62
  285. package/dist/typings/classes/state/render.d.ts +9 -9
  286. package/dist/typings/classes/state/scroll.d.ts +16 -16
  287. package/dist/typings/classes/state.d.ts +27 -27
  288. package/dist/typings/classes/viewport.d.ts +32 -32
  289. package/dist/typings/index.d.ts +9 -9
  290. package/dist/typings/inputs/adapter.d.ts +5 -5
  291. package/dist/typings/inputs/common.d.ts +9 -9
  292. package/dist/typings/inputs/datasource.d.ts +7 -7
  293. package/dist/typings/inputs/index.d.ts +6 -6
  294. package/dist/typings/inputs/settings.d.ts +41 -41
  295. package/dist/typings/inputs/validation.d.ts +83 -83
  296. package/dist/typings/interfaces/adapter.d.ts +156 -156
  297. package/dist/typings/interfaces/datasource.d.ts +26 -26
  298. package/dist/typings/interfaces/index.d.ts +10 -10
  299. package/dist/typings/interfaces/item.d.ts +8 -8
  300. package/dist/typings/interfaces/process.d.ts +35 -35
  301. package/dist/typings/interfaces/routines.d.ts +157 -157
  302. package/dist/typings/interfaces/settings.d.ts +31 -31
  303. package/dist/typings/interfaces/state.d.ts +22 -22
  304. package/dist/typings/interfaces/validation.d.ts +33 -33
  305. package/dist/typings/interfaces/workflow.d.ts +53 -53
  306. package/dist/typings/processes/adapter/append.d.ts +14 -14
  307. package/dist/typings/processes/adapter/check.d.ts +6 -6
  308. package/dist/typings/processes/adapter/clip.d.ts +7 -7
  309. package/dist/typings/processes/adapter/fix.d.ts +13 -13
  310. package/dist/typings/processes/adapter/insert.d.ts +11 -11
  311. package/dist/typings/processes/adapter/reload.d.ts +6 -6
  312. package/dist/typings/processes/adapter/remove.d.ts +11 -11
  313. package/dist/typings/processes/adapter/replace.d.ts +8 -8
  314. package/dist/typings/processes/adapter/reset.d.ts +7 -7
  315. package/dist/typings/processes/adapter/update.d.ts +8 -8
  316. package/dist/typings/processes/adjust.d.ts +10 -10
  317. package/dist/typings/processes/clip.d.ts +7 -7
  318. package/dist/typings/processes/end.d.ts +10 -10
  319. package/dist/typings/processes/fetch.d.ts +18 -18
  320. package/dist/typings/processes/index.d.ts +23 -23
  321. package/dist/typings/processes/init.d.ts +7 -7
  322. package/dist/typings/processes/misc/base.d.ts +4 -4
  323. package/dist/typings/processes/misc/enums.d.ts +32 -32
  324. package/dist/typings/processes/misc/index.d.ts +2 -2
  325. package/dist/typings/processes/postFetch.d.ts +8 -8
  326. package/dist/typings/processes/preClip.d.ts +12 -12
  327. package/dist/typings/processes/preFetch.d.ts +17 -17
  328. package/dist/typings/processes/render.d.ts +9 -9
  329. package/dist/typings/processes/scroll.d.ts +13 -13
  330. package/dist/typings/processes/start.d.ts +6 -6
  331. package/dist/typings/scroller.d.ts +26 -26
  332. package/dist/typings/version.d.ts +5 -5
  333. package/dist/typings/workflow-transducer.d.ts +2 -2
  334. package/dist/typings/workflow.d.ts +28 -28
  335. package/package.json +68 -68
@@ -1,261 +1,261 @@
1
- import { DefaultSize } from './defaultSize';
2
- import { Direction } from '../../inputs/index';
3
- var ItemCache = /** @class */ (function () {
4
- function ItemCache(item, saveData) {
5
- this.$index = item.$index;
6
- this.data = saveData ? item.data : null;
7
- this.size = item.size;
8
- }
9
- ItemCache.prototype.changeIndex = function (value) {
10
- this.$index = value;
11
- };
12
- return ItemCache;
13
- }());
14
- export { ItemCache };
15
- var Cache = /** @class */ (function () {
16
- function Cache(_a, logger) {
17
- var itemSize = _a.itemSize, cacheData = _a.cacheData, cacheOnReload = _a.cacheOnReload, sizeStrategy = _a.sizeStrategy;
18
- this.itemSize = itemSize;
19
- this.saveData = cacheData;
20
- this.cacheOnReload = cacheOnReload;
21
- this.sizeStrategy = sizeStrategy;
22
- this.logger = logger;
23
- this.items = new Map();
24
- this.defaultSize = new DefaultSize(itemSize, sizeStrategy);
25
- this.reset(true);
26
- }
27
- Cache.prototype.reset = function (force) {
28
- force = force || !this.cacheOnReload;
29
- if (force) {
30
- this.minIndex = +Infinity;
31
- this.maxIndex = -Infinity;
32
- this.items.clear();
33
- }
34
- this.defaultSize.reset(force);
35
- };
36
- Object.defineProperty(Cache.prototype, "size", {
37
- get: function () {
38
- return this.items.size;
39
- },
40
- enumerable: false,
41
- configurable: true
42
- });
43
- Cache.prototype.get = function (index) {
44
- return this.items.get(index);
45
- };
46
- Cache.prototype.getSizeByIndex = function (index) {
47
- var item = this.get(index);
48
- return item && item.size || this.defaultSize.get();
49
- };
50
- Cache.prototype.getDefaultSize = function () {
51
- return this.defaultSize.get();
52
- };
53
- Cache.prototype.recalculateDefaultSize = function () {
54
- var _this = this;
55
- if (this.defaultSize.recalculate(this.size)) {
56
- this.logger.log(function () { return "default size has been updated: ".concat(_this.defaultSize.get()); });
57
- return true;
58
- }
59
- return false;
60
- };
61
- /**
62
- * Adds item to Set by $index, replaces existed item if $index matches.
63
- * Maintains min/max indexes and default item size.
64
- *
65
- * @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.
66
- *
67
- * @returns {ItemCache<Data>} Cached item.
68
- */
69
- Cache.prototype.add = function (item) {
70
- var itemCache = this.get(item.$index);
71
- if (itemCache) { // adding item is already cached
72
- if (this.saveData) {
73
- itemCache.data = item.data;
74
- }
75
- if (itemCache.size !== item.size) {
76
- if (itemCache.size) {
77
- this.defaultSize.setExisted(itemCache.size, item.size);
78
- }
79
- else {
80
- this.defaultSize.setNew(item.size);
81
- }
82
- itemCache.size = item.size;
83
- }
84
- }
85
- else {
86
- itemCache = new ItemCache(item, this.saveData);
87
- this.items.set(item.$index, itemCache);
88
- this.defaultSize.setNew(item.size);
89
- }
90
- if (item.$index < this.minIndex) {
91
- this.minIndex = item.$index;
92
- }
93
- if (item.$index > this.maxIndex) {
94
- this.maxIndex = item.$index;
95
- }
96
- return itemCache;
97
- };
98
- /**
99
- * Inserts items to Set, shifts $indexes of items that remain.
100
- * Replaces current Set with a new one with new regular $indexes.
101
- * Maintains min/max indexes.
102
- *
103
- * @param {Data[]} toInsert List of non-indexed items to be inserted.
104
- * @param {number} index The index before/after which the insertion is performed.
105
- * @param {Direction} direction Determines the direction of insertion.
106
- * @param {boolean} fixRight Defines indexes shifting strategy.
107
- * If false, indexes that are greater than the inserted ones are increased.
108
- * If true, indexes that are less than than the inserted ones are decreased.
109
- */
110
- Cache.prototype.insertItems = function (toInsert, index, direction, fixRight) {
111
- var _this = this;
112
- var items = new Map();
113
- var length = toInsert.length;
114
- var min = Infinity, max = -Infinity;
115
- var set = function (item) {
116
- items.set(item.$index, item);
117
- min = item.$index < min ? item.$index : min;
118
- max = item.$index > max ? item.$index : max;
119
- };
120
- this.items.forEach(function (item) {
121
- var shift = 0;
122
- if (direction === Direction.backward) {
123
- if (item.$index < index && fixRight) {
124
- shift = -length;
125
- }
126
- else if (item.$index >= index && !fixRight) {
127
- shift = length;
128
- }
129
- }
130
- else if (direction === Direction.forward) {
131
- if (item.$index <= index && fixRight) {
132
- shift = -length;
133
- }
134
- else if (item.$index > index && !fixRight) {
135
- shift = length;
136
- }
137
- }
138
- if (shift) {
139
- item.changeIndex(item.$index + shift);
140
- }
141
- set(item);
142
- });
143
- if (this.saveData) { // persist data with no sizes
144
- toInsert.forEach(function (data, i) {
145
- var $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);
146
- var item = new ItemCache({ $index: $index, data: data }, _this.saveData);
147
- set(item);
148
- });
149
- }
150
- this.items = items;
151
- this.minIndex = min;
152
- this.maxIndex = max;
153
- };
154
- /**
155
- * Removes items from Set, shifts $indexes of items that remain.
156
- * Replaces current Set with a new one with new regular $indexes.
157
- * Maintains min/max indexes and default item size.
158
- *
159
- * @param {number[]} toRemove List of indexes to be removed.
160
- * @param {boolean} fixRight Defines indexes shifting strategy.
161
- * If false, indexes that are greater than the removed ones will be decreased.
162
- * If true, indexes that are less than than the removed ones will be increased.
163
- */
164
- Cache.prototype.removeItems = function (toRemove, fixRight) {
165
- var _this = this;
166
- var items = new Map();
167
- var min = Infinity, max = -Infinity;
168
- this.items.forEach(function (item) {
169
- if (toRemove.some(function (index) { return index === item.$index; })) {
170
- if (item.size) {
171
- _this.defaultSize.setRemoved(item.size);
172
- }
173
- return;
174
- }
175
- var diff = fixRight
176
- ? toRemove.reduce(function (acc, index) { return acc + (item.$index < index ? 1 : 0); }, 0)
177
- : toRemove.reduce(function (acc, index) { return acc - (item.$index > index ? 1 : 0); }, 0);
178
- item.changeIndex(item.$index + diff);
179
- items.set(item.$index, item);
180
- min = item.$index < min ? item.$index : min;
181
- max = item.$index > max ? item.$index : max;
182
- });
183
- this.items = items;
184
- this.minIndex = min;
185
- this.maxIndex = max;
186
- };
187
- /**
188
- * Destructively updates Set based on subset (before-after) changes.
189
- * Replaces current Set with a new one with new regular $indexes.
190
- * Maintains min/max indexes. Maintains default item size on remove only.
191
- *
192
- * @param {ItemUpdate[]} before Initial subset of items to be replaced by "after".
193
- * Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.
194
- * Items to be removed must have toRemove flag: before[].toRemove = true.
195
- * @param {Item<Data>[]} after Transformed subset that replaces "before". Must be $index-incremental.
196
- * Must contain at least 1 $index from "before" or be empty.
197
- * @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if "after" is empty.
198
- */
199
- Cache.prototype.updateSubset = function (before, after, fixRight) {
200
- var _this = this;
201
- if (!this.size || !before.length) {
202
- return;
203
- }
204
- var minB = before[0].$index, maxB = before[before.length - 1].$index;
205
- var leftDiff, rightDiff;
206
- if (after.length) {
207
- var minA = after[0].$index, maxA = after[after.length - 1].$index;
208
- leftDiff = minA - minB;
209
- rightDiff = maxA - maxB;
210
- }
211
- else {
212
- leftDiff = fixRight ? maxB - minB + 1 : 0;
213
- rightDiff = fixRight ? 0 : minB - maxB - 1;
214
- }
215
- var items = new Map();
216
- this.items.forEach(function (item) {
217
- if (item.$index < minB) { // items to the left of the subset
218
- item.changeIndex(item.$index + leftDiff);
219
- items.set(item.$index, item);
220
- return;
221
- }
222
- else if (item.$index > maxB) { // items to the right of the subset
223
- item.changeIndex(item.$index + rightDiff);
224
- items.set(item.$index, item);
225
- return;
226
- }
227
- });
228
- after.forEach(function (item) {
229
- return items.set(item.$index, new ItemCache(item, _this.saveData));
230
- });
231
- before // to maintain default size on remove
232
- .filter(function (item) { return item.toRemove; })
233
- .forEach(function (item) { return _this.defaultSize.setRemoved(item.size); });
234
- this.minIndex += leftDiff;
235
- this.maxIndex += rightDiff;
236
- this.items = items;
237
- };
238
- /**
239
- * Shifts all indexes by some value.
240
- * Replaces current Set with a new one with new regular $indexes.
241
- * Maintains min/max indexes.
242
- *
243
- * @param {number} delta A shift value.
244
- */
245
- Cache.prototype.shiftIndexes = function (delta) {
246
- var items = new Map();
247
- var min = Infinity, max = -Infinity;
248
- this.items.forEach(function (item) {
249
- item.changeIndex(item.$index + delta);
250
- items.set(item.$index, item);
251
- min = item.$index < min ? item.$index : min;
252
- max = item.$index > max ? item.$index : max;
253
- });
254
- this.items = items;
255
- this.minIndex = min;
256
- this.maxIndex = max;
257
- };
258
- return Cache;
259
- }());
260
- export { Cache };
1
+ import { DefaultSize } from './defaultSize';
2
+ import { Direction } from '../../inputs/index';
3
+ var ItemCache = /** @class */ (function () {
4
+ function ItemCache(item, saveData) {
5
+ this.$index = item.$index;
6
+ this.data = saveData ? item.data : null;
7
+ this.size = item.size;
8
+ }
9
+ ItemCache.prototype.changeIndex = function (value) {
10
+ this.$index = value;
11
+ };
12
+ return ItemCache;
13
+ }());
14
+ export { ItemCache };
15
+ var Cache = /** @class */ (function () {
16
+ function Cache(_a, logger) {
17
+ var itemSize = _a.itemSize, cacheData = _a.cacheData, cacheOnReload = _a.cacheOnReload, sizeStrategy = _a.sizeStrategy;
18
+ this.itemSize = itemSize;
19
+ this.saveData = cacheData;
20
+ this.cacheOnReload = cacheOnReload;
21
+ this.sizeStrategy = sizeStrategy;
22
+ this.logger = logger;
23
+ this.items = new Map();
24
+ this.defaultSize = new DefaultSize(itemSize, sizeStrategy);
25
+ this.reset(true);
26
+ }
27
+ Cache.prototype.reset = function (force) {
28
+ force = force || !this.cacheOnReload;
29
+ if (force) {
30
+ this.minIndex = +Infinity;
31
+ this.maxIndex = -Infinity;
32
+ this.items.clear();
33
+ }
34
+ this.defaultSize.reset(force);
35
+ };
36
+ Object.defineProperty(Cache.prototype, "size", {
37
+ get: function () {
38
+ return this.items.size;
39
+ },
40
+ enumerable: false,
41
+ configurable: true
42
+ });
43
+ Cache.prototype.get = function (index) {
44
+ return this.items.get(index);
45
+ };
46
+ Cache.prototype.getSizeByIndex = function (index) {
47
+ var item = this.get(index);
48
+ return item && item.size || this.defaultSize.get();
49
+ };
50
+ Cache.prototype.getDefaultSize = function () {
51
+ return this.defaultSize.get();
52
+ };
53
+ Cache.prototype.recalculateDefaultSize = function () {
54
+ var _this = this;
55
+ if (this.defaultSize.recalculate(this.size)) {
56
+ this.logger.log(function () { return "default size has been updated: ".concat(_this.defaultSize.get()); });
57
+ return true;
58
+ }
59
+ return false;
60
+ };
61
+ /**
62
+ * Adds item to Set by $index, replaces existed item if $index matches.
63
+ * Maintains min/max indexes and default item size.
64
+ *
65
+ * @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.
66
+ *
67
+ * @returns {ItemCache<Data>} Cached item.
68
+ */
69
+ Cache.prototype.add = function (item) {
70
+ var itemCache = this.get(item.$index);
71
+ if (itemCache) { // adding item is already cached
72
+ if (this.saveData) {
73
+ itemCache.data = item.data;
74
+ }
75
+ if (itemCache.size !== item.size) {
76
+ if (itemCache.size) {
77
+ this.defaultSize.setExisted(itemCache.size, item.size);
78
+ }
79
+ else {
80
+ this.defaultSize.setNew(item.size);
81
+ }
82
+ itemCache.size = item.size;
83
+ }
84
+ }
85
+ else {
86
+ itemCache = new ItemCache(item, this.saveData);
87
+ this.items.set(item.$index, itemCache);
88
+ this.defaultSize.setNew(item.size);
89
+ }
90
+ if (item.$index < this.minIndex) {
91
+ this.minIndex = item.$index;
92
+ }
93
+ if (item.$index > this.maxIndex) {
94
+ this.maxIndex = item.$index;
95
+ }
96
+ return itemCache;
97
+ };
98
+ /**
99
+ * Inserts items to Set, shifts $indexes of items that remain.
100
+ * Replaces current Set with a new one with new regular $indexes.
101
+ * Maintains min/max indexes.
102
+ *
103
+ * @param {Data[]} toInsert List of non-indexed items to be inserted.
104
+ * @param {number} index The index before/after which the insertion is performed.
105
+ * @param {Direction} direction Determines the direction of insertion.
106
+ * @param {boolean} fixRight Defines indexes shifting strategy.
107
+ * If false, indexes that are greater than the inserted ones are increased.
108
+ * If true, indexes that are less than than the inserted ones are decreased.
109
+ */
110
+ Cache.prototype.insertItems = function (toInsert, index, direction, fixRight) {
111
+ var _this = this;
112
+ var items = new Map();
113
+ var length = toInsert.length;
114
+ var min = Infinity, max = -Infinity;
115
+ var set = function (item) {
116
+ items.set(item.$index, item);
117
+ min = item.$index < min ? item.$index : min;
118
+ max = item.$index > max ? item.$index : max;
119
+ };
120
+ this.items.forEach(function (item) {
121
+ var shift = 0;
122
+ if (direction === Direction.backward) {
123
+ if (item.$index < index && fixRight) {
124
+ shift = -length;
125
+ }
126
+ else if (item.$index >= index && !fixRight) {
127
+ shift = length;
128
+ }
129
+ }
130
+ else if (direction === Direction.forward) {
131
+ if (item.$index <= index && fixRight) {
132
+ shift = -length;
133
+ }
134
+ else if (item.$index > index && !fixRight) {
135
+ shift = length;
136
+ }
137
+ }
138
+ if (shift) {
139
+ item.changeIndex(item.$index + shift);
140
+ }
141
+ set(item);
142
+ });
143
+ if (this.saveData) { // persist data with no sizes
144
+ toInsert.forEach(function (data, i) {
145
+ var $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);
146
+ var item = new ItemCache({ $index: $index, data: data }, _this.saveData);
147
+ set(item);
148
+ });
149
+ }
150
+ this.items = items;
151
+ this.minIndex = min;
152
+ this.maxIndex = max;
153
+ };
154
+ /**
155
+ * Removes items from Set, shifts $indexes of items that remain.
156
+ * Replaces current Set with a new one with new regular $indexes.
157
+ * Maintains min/max indexes and default item size.
158
+ *
159
+ * @param {number[]} toRemove List of indexes to be removed.
160
+ * @param {boolean} fixRight Defines indexes shifting strategy.
161
+ * If false, indexes that are greater than the removed ones will be decreased.
162
+ * If true, indexes that are less than than the removed ones will be increased.
163
+ */
164
+ Cache.prototype.removeItems = function (toRemove, fixRight) {
165
+ var _this = this;
166
+ var items = new Map();
167
+ var min = Infinity, max = -Infinity;
168
+ this.items.forEach(function (item) {
169
+ if (toRemove.some(function (index) { return index === item.$index; })) {
170
+ if (item.size) {
171
+ _this.defaultSize.setRemoved(item.size);
172
+ }
173
+ return;
174
+ }
175
+ var diff = fixRight
176
+ ? toRemove.reduce(function (acc, index) { return acc + (item.$index < index ? 1 : 0); }, 0)
177
+ : toRemove.reduce(function (acc, index) { return acc - (item.$index > index ? 1 : 0); }, 0);
178
+ item.changeIndex(item.$index + diff);
179
+ items.set(item.$index, item);
180
+ min = item.$index < min ? item.$index : min;
181
+ max = item.$index > max ? item.$index : max;
182
+ });
183
+ this.items = items;
184
+ this.minIndex = min;
185
+ this.maxIndex = max;
186
+ };
187
+ /**
188
+ * Destructively updates Set based on subset (before-after) changes.
189
+ * Replaces current Set with a new one with new regular $indexes.
190
+ * Maintains min/max indexes. Maintains default item size on remove only.
191
+ *
192
+ * @param {ItemUpdate[]} before Initial subset of items to be replaced by "after".
193
+ * Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.
194
+ * Items to be removed must have toRemove flag: before[].toRemove = true.
195
+ * @param {Item<Data>[]} after Transformed subset that replaces "before". Must be $index-incremental.
196
+ * Must contain at least 1 $index from "before" or be empty.
197
+ * @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if "after" is empty.
198
+ */
199
+ Cache.prototype.updateSubset = function (before, after, fixRight) {
200
+ var _this = this;
201
+ if (!this.size || !before.length) {
202
+ return;
203
+ }
204
+ var minB = before[0].$index, maxB = before[before.length - 1].$index;
205
+ var leftDiff, rightDiff;
206
+ if (after.length) {
207
+ var minA = after[0].$index, maxA = after[after.length - 1].$index;
208
+ leftDiff = minA - minB;
209
+ rightDiff = maxA - maxB;
210
+ }
211
+ else {
212
+ leftDiff = fixRight ? maxB - minB + 1 : 0;
213
+ rightDiff = fixRight ? 0 : minB - maxB - 1;
214
+ }
215
+ var items = new Map();
216
+ this.items.forEach(function (item) {
217
+ if (item.$index < minB) { // items to the left of the subset
218
+ item.changeIndex(item.$index + leftDiff);
219
+ items.set(item.$index, item);
220
+ return;
221
+ }
222
+ else if (item.$index > maxB) { // items to the right of the subset
223
+ item.changeIndex(item.$index + rightDiff);
224
+ items.set(item.$index, item);
225
+ return;
226
+ }
227
+ });
228
+ after.forEach(function (item) {
229
+ return items.set(item.$index, new ItemCache(item, _this.saveData));
230
+ });
231
+ before // to maintain default size on remove
232
+ .filter(function (item) { return item.toRemove; })
233
+ .forEach(function (item) { return _this.defaultSize.setRemoved(item.size); });
234
+ this.minIndex += leftDiff;
235
+ this.maxIndex += rightDiff;
236
+ this.items = items;
237
+ };
238
+ /**
239
+ * Shifts all indexes by some value.
240
+ * Replaces current Set with a new one with new regular $indexes.
241
+ * Maintains min/max indexes.
242
+ *
243
+ * @param {number} delta A shift value.
244
+ */
245
+ Cache.prototype.shiftIndexes = function (delta) {
246
+ var items = new Map();
247
+ var min = Infinity, max = -Infinity;
248
+ this.items.forEach(function (item) {
249
+ item.changeIndex(item.$index + delta);
250
+ items.set(item.$index, item);
251
+ min = item.$index < min ? item.$index : min;
252
+ max = item.$index > max ? item.$index : max;
253
+ });
254
+ this.items = items;
255
+ this.minIndex = min;
256
+ this.maxIndex = max;
257
+ };
258
+ return Cache;
259
+ }());
260
+ export { Cache };
261
261
  //# sourceMappingURL=cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/classes/buffer/cache.ts"],"names":[],"mappings":"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","sourcesContent":["import { DefaultSize } from './defaultSize';\nimport { Item } from '../item';\nimport { Settings } from '../settings';\nimport { Logger } from '../logger';\nimport { SizeStrategy, Direction } from '../../inputs/index';\n\ninterface ItemToCache<Data> {\n $index: number;\n data: Data;\n size?: number;\n}\n\ninterface ItemUpdate {\n $index: number;\n size: number;\n toRemove?: boolean;\n}\n\nexport class ItemCache<Data = unknown> {\n $index: number;\n data: Data | null;\n size?: number;\n position: number;\n\n constructor(item: ItemToCache<Data>, saveData: boolean) {\n this.$index = item.$index;\n this.data = saveData ? item.data : null;\n this.size = item.size;\n }\n\n changeIndex(value: number): void {\n this.$index = value;\n }\n}\n\nexport class Cache<Data = unknown> {\n minIndex: number;\n maxIndex: number;\n\n readonly itemSize: number;\n readonly saveData: boolean;\n readonly cacheOnReload: boolean;\n readonly sizeStrategy: SizeStrategy;\n readonly logger: Logger;\n private items: Map<number, ItemCache<Data>>;\n private defaultSize: DefaultSize;\n\n constructor({ itemSize, cacheData, cacheOnReload, sizeStrategy }: Settings, logger: Logger) {\n this.itemSize = itemSize;\n this.saveData = cacheData;\n this.cacheOnReload = cacheOnReload;\n this.sizeStrategy = sizeStrategy;\n this.logger = logger;\n this.items = new Map<number, ItemCache<Data>>();\n this.defaultSize = new DefaultSize(itemSize, sizeStrategy);\n this.reset(true);\n }\n\n reset(force: boolean): void {\n force = force || !this.cacheOnReload;\n if (force) {\n this.minIndex = +Infinity;\n this.maxIndex = -Infinity;\n this.items.clear();\n }\n this.defaultSize.reset(force);\n }\n\n get size(): number {\n return this.items.size;\n }\n\n get(index: number): ItemCache<Data> | undefined {\n return this.items.get(index);\n }\n\n getSizeByIndex(index: number): number {\n const item = this.get(index);\n return item && item.size || this.defaultSize.get();\n }\n\n getDefaultSize(): number {\n return this.defaultSize.get();\n }\n\n recalculateDefaultSize(): boolean {\n if (this.defaultSize.recalculate(this.size)) {\n this.logger.log(() => `default size has been updated: ${this.defaultSize.get()}`);\n return true;\n }\n return false;\n }\n\n /**\n * Adds item to Set by $index, replaces existed item if $index matches.\n * Maintains min/max indexes and default item size.\n *\n * @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.\n * \n * @returns {ItemCache<Data>} Cached item.\n */\n add(item: Item<Data>): ItemCache<Data> {\n let itemCache = this.get(item.$index);\n if (itemCache) { // adding item is already cached\n if (this.saveData) {\n itemCache.data = item.data;\n }\n if (itemCache.size !== item.size) {\n if (itemCache.size) {\n this.defaultSize.setExisted(itemCache.size, item.size);\n } else {\n this.defaultSize.setNew(item.size);\n }\n itemCache.size = item.size;\n }\n } else {\n itemCache = new ItemCache<Data>(item, this.saveData);\n this.items.set(item.$index, itemCache);\n this.defaultSize.setNew(item.size);\n }\n if (item.$index < this.minIndex) {\n this.minIndex = item.$index;\n }\n if (item.$index > this.maxIndex) {\n this.maxIndex = item.$index;\n }\n return itemCache;\n }\n\n /**\n * Inserts items to Set, shifts $indexes of items that remain.\n * Replaces current Set with a new one with new regular $indexes.\n * Maintains min/max indexes.\n *\n * @param {Data[]} toInsert List of non-indexed items to be inserted.\n * @param {number} index The index before/after which the insertion is performed.\n * @param {Direction} direction Determines the direction of insertion.\n * @param {boolean} fixRight Defines indexes shifting strategy.\n * If false, indexes that are greater than the inserted ones are increased.\n * If true, indexes that are less than than the inserted ones are decreased.\n */\n insertItems(toInsert: Data[], index: number, direction: Direction, fixRight: boolean): void {\n const items = new Map<number, ItemCache<Data>>();\n const length = toInsert.length;\n let min = Infinity, max = -Infinity;\n const set = (item: ItemCache<Data>) => {\n items.set(item.$index, item);\n min = item.$index < min ? item.$index : min;\n max = item.$index > max ? item.$index : max;\n };\n this.items.forEach(item => {\n let shift = 0;\n if (direction === Direction.backward) {\n if (item.$index < index && fixRight) {\n shift = -length;\n } else if (item.$index >= index && !fixRight) {\n shift = length;\n }\n } else if (direction === Direction.forward) {\n if (item.$index <= index && fixRight) {\n shift = -length;\n } else if (item.$index > index && !fixRight) {\n shift = length;\n }\n }\n if (shift) {\n item.changeIndex(item.$index + shift);\n }\n set(item);\n });\n if (this.saveData) { // persist data with no sizes\n toInsert.forEach((data, i) => {\n const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);\n const item = new ItemCache<Data>({ $index, data }, this.saveData);\n set(item);\n });\n }\n this.items = items;\n this.minIndex = min;\n this.maxIndex = max;\n }\n\n /**\n * Removes items from Set, shifts $indexes of items that remain.\n * Replaces current Set with a new one with new regular $indexes.\n * Maintains min/max indexes and default item size.\n *\n * @param {number[]} toRemove List of indexes to be removed.\n * @param {boolean} fixRight Defines indexes shifting strategy.\n * If false, indexes that are greater than the removed ones will be decreased.\n * If true, indexes that are less than than the removed ones will be increased.\n */\n removeItems(toRemove: number[], fixRight: boolean): void {\n const items = new Map<number, ItemCache<Data>>();\n let min = Infinity, max = -Infinity;\n this.items.forEach(item => {\n if (toRemove.some(index => index === item.$index)) {\n if (item.size) {\n this.defaultSize.setRemoved(item.size);\n }\n return;\n }\n const diff = fixRight\n ? toRemove.reduce((acc, index) => acc + (item.$index < index ? 1 : 0), 0)\n : toRemove.reduce((acc, index) => acc - (item.$index > index ? 1 : 0), 0);\n item.changeIndex(item.$index + diff);\n items.set(item.$index, item);\n min = item.$index < min ? item.$index : min;\n max = item.$index > max ? item.$index : max;\n });\n this.items = items;\n this.minIndex = min;\n this.maxIndex = max;\n }\n\n /**\n * Destructively updates Set based on subset (before-after) changes.\n * Replaces current Set with a new one with new regular $indexes.\n * Maintains min/max indexes. Maintains default item size on remove only.\n *\n * @param {ItemUpdate[]} before Initial subset of items to be replaced by \"after\".\n * Each element is an object with { $index, size, toRemove } props. Must be $index-incremental.\n * Items to be removed must have toRemove flag: before[].toRemove = true.\n * @param {Item<Data>[]} after Transformed subset that replaces \"before\". Must be $index-incremental.\n * Must contain at least 1 $index from \"before\" or be empty.\n * @param {boolean} fixRight This is to fix right indexes during subset collapsing. Acts only if \"after\" is empty.\n */\n updateSubset(before: ItemUpdate[], after: Item<Data>[], fixRight?: boolean): void {\n if (!this.size || !before.length) {\n return;\n }\n const minB = before[0].$index, maxB = before[before.length - 1].$index;\n let leftDiff: number, rightDiff: number;\n if (after.length) {\n const minA = after[0].$index, maxA = after[after.length - 1].$index;\n leftDiff = minA - minB;\n rightDiff = maxA - maxB;\n } else {\n leftDiff = fixRight ? maxB - minB + 1 : 0;\n rightDiff = fixRight ? 0 : minB - maxB - 1;\n }\n const items = new Map<number, ItemCache<Data>>();\n this.items.forEach(item => {\n if (item.$index < minB) { // items to the left of the subset\n item.changeIndex(item.$index + leftDiff);\n items.set(item.$index, item);\n return;\n } else if (item.$index > maxB) { // items to the right of the subset\n item.changeIndex(item.$index + rightDiff);\n items.set(item.$index, item);\n return;\n }\n });\n after.forEach(item => // subset items\n items.set(item.$index, new ItemCache<Data>(item, this.saveData))\n );\n before // to maintain default size on remove\n .filter(item => item.toRemove)\n .forEach(item => this.defaultSize.setRemoved(item.size));\n this.minIndex += leftDiff;\n this.maxIndex += rightDiff;\n this.items = items;\n }\n\n /**\n * Shifts all indexes by some value.\n * Replaces current Set with a new one with new regular $indexes.\n * Maintains min/max indexes.\n *\n * @param {number} delta A shift value.\n */\n shiftIndexes(delta: number): void {\n const items = new Map<number, ItemCache<Data>>();\n let min = Infinity, max = -Infinity;\n this.items.forEach(item => {\n item.changeIndex(item.$index + delta);\n items.set(item.$index, item);\n min = item.$index < min ? item.$index : min;\n max = item.$index > max ? item.$index : max;\n });\n this.items = items;\n this.minIndex = min;\n this.maxIndex = max;\n }\n}\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"]}