@typed/template 0.14.0 → 1.0.0-beta.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 (453) hide show
  1. package/README.md +108 -2
  2. package/dist/EventHandler.d.ts +273 -0
  3. package/dist/EventHandler.d.ts.map +1 -0
  4. package/dist/EventHandler.js +261 -0
  5. package/dist/EventSource.d.ts +82 -0
  6. package/dist/EventSource.d.ts.map +1 -0
  7. package/dist/EventSource.js +127 -0
  8. package/dist/Html.d.ts +122 -0
  9. package/dist/Html.d.ts.map +1 -0
  10. package/dist/Html.js +250 -0
  11. package/dist/HtmlChunk.d.ts +118 -0
  12. package/dist/HtmlChunk.d.ts.map +1 -0
  13. package/dist/HtmlChunk.js +211 -0
  14. package/dist/HydrateContext.d.ts +28 -0
  15. package/dist/HydrateContext.d.ts.map +1 -0
  16. package/dist/HydrateContext.js +25 -0
  17. package/dist/Parser.d.ts +35 -0
  18. package/dist/Parser.d.ts.map +1 -0
  19. package/dist/Parser.js +437 -0
  20. package/dist/Render.d.ts +195 -0
  21. package/dist/Render.d.ts.map +1 -0
  22. package/dist/Render.js +609 -0
  23. package/dist/RenderEvent.d.ts +179 -0
  24. package/dist/RenderEvent.d.ts.map +1 -0
  25. package/dist/RenderEvent.js +102 -0
  26. package/dist/RenderQueue.d.ts +167 -0
  27. package/dist/RenderQueue.d.ts.map +1 -0
  28. package/dist/RenderQueue.js +297 -0
  29. package/dist/RenderTemplate.d.ts +90 -0
  30. package/dist/RenderTemplate.d.ts.map +1 -0
  31. package/dist/RenderTemplate.js +87 -0
  32. package/dist/Renderable.d.ts +88 -0
  33. package/dist/Renderable.d.ts.map +1 -0
  34. package/dist/Renderable.js +3 -0
  35. package/dist/{dts/Template.d.ts → Template.d.ts} +109 -74
  36. package/dist/Template.d.ts.map +1 -0
  37. package/dist/{esm/Template.js → Template.js} +96 -56
  38. package/dist/Wire.d.ts +169 -0
  39. package/dist/Wire.d.ts.map +1 -0
  40. package/dist/Wire.js +217 -0
  41. package/dist/errors.d.ts +145 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/errors.js +159 -0
  44. package/dist/index.d.ts +15 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +14 -0
  47. package/dist/internal/IndexRefCounter.d.ts +11 -0
  48. package/dist/internal/IndexRefCounter.d.ts.map +1 -0
  49. package/dist/internal/IndexRefCounter.js +42 -0
  50. package/dist/internal/ParentChildNodes.d.ts +6 -0
  51. package/dist/internal/ParentChildNodes.d.ts.map +1 -0
  52. package/dist/internal/ParentChildNodes.js +1 -0
  53. package/dist/internal/PathStack.d.ts +9 -0
  54. package/dist/internal/PathStack.d.ts.map +1 -0
  55. package/dist/internal/PathStack.js +18 -0
  56. package/dist/internal/buildTemplateFragement.d.ts +3 -0
  57. package/dist/internal/buildTemplateFragement.d.ts.map +1 -0
  58. package/dist/internal/buildTemplateFragement.js +61 -0
  59. package/dist/internal/diff.d.ts +2 -0
  60. package/dist/internal/diff.d.ts.map +1 -0
  61. package/dist/internal/diff.js +119 -0
  62. package/dist/internal/dom.d.ts +45 -0
  63. package/dist/internal/dom.d.ts.map +1 -0
  64. package/dist/internal/dom.js +304 -0
  65. package/dist/internal/encoding.d.ts +7 -0
  66. package/dist/internal/encoding.d.ts.map +1 -0
  67. package/dist/internal/encoding.js +134 -0
  68. package/dist/{dts/internal/v2/hydration-template.d.ts → internal/hydration.d.ts} +10 -7
  69. package/dist/internal/hydration.d.ts.map +1 -0
  70. package/dist/{esm/internal/v2/hydration-template.js → internal/hydration.js} +80 -26
  71. package/dist/internal/keyToPartType.d.ts +2 -0
  72. package/dist/internal/keyToPartType.d.ts.map +1 -0
  73. package/dist/internal/keyToPartType.js +110 -0
  74. package/dist/internal/meta.d.ts +17 -0
  75. package/dist/internal/meta.d.ts.map +1 -0
  76. package/dist/internal/meta.js +14 -0
  77. package/dist/internal/takeOneIfNotRenderEvent.d.ts +4 -0
  78. package/dist/internal/takeOneIfNotRenderEvent.d.ts.map +1 -0
  79. package/dist/internal/takeOneIfNotRenderEvent.js +10 -0
  80. package/dist/internal/templateHash.d.ts +2 -0
  81. package/dist/internal/templateHash.d.ts.map +1 -0
  82. package/dist/internal/templateHash.js +14 -0
  83. package/dist/many.d.ts +68 -0
  84. package/dist/many.d.ts.map +1 -0
  85. package/dist/many.js +107 -0
  86. package/package.json +22 -224
  87. package/src/EventHandler.ts +318 -86
  88. package/src/EventSource.ts +202 -0
  89. package/src/Html.test.ts +490 -0
  90. package/src/Html.ts +292 -333
  91. package/src/HtmlChunk.ts +290 -332
  92. package/src/HydrateContext.ts +40 -0
  93. package/src/Hydration.test.ts +409 -0
  94. package/src/Parser.test.ts +924 -0
  95. package/src/Parser.ts +598 -10
  96. package/src/Render.test.ts +338 -0
  97. package/src/Render.ts +878 -63
  98. package/src/RenderEvent.ts +169 -40
  99. package/src/RenderQueue.ts +290 -385
  100. package/src/RenderTemplate.ts +98 -31
  101. package/src/Renderable.ts +122 -24
  102. package/src/Template.ts +246 -145
  103. package/src/Wire.ts +309 -0
  104. package/src/errors.ts +173 -0
  105. package/src/index.ts +14 -66
  106. package/src/internal/IndexRefCounter.ts +53 -0
  107. package/src/internal/ParentChildNodes.ts +7 -0
  108. package/src/internal/PathStack.ts +23 -0
  109. package/src/internal/buildTemplateFragement.ts +82 -0
  110. package/src/internal/diff.ts +127 -0
  111. package/src/internal/dom.ts +357 -0
  112. package/src/internal/encoding.ts +147 -0
  113. package/src/internal/hydration.ts +406 -0
  114. package/src/internal/keyToPartType.ts +113 -0
  115. package/src/internal/meta.ts +25 -0
  116. package/src/internal/takeOneIfNotRenderEvent.ts +19 -0
  117. package/src/internal/templateHash.ts +18 -0
  118. package/src/many.ts +148 -0
  119. package/tsconfig.json +6 -0
  120. package/Directive/package.json +0 -6
  121. package/ElementRef/package.json +0 -6
  122. package/ElementSource/package.json +0 -6
  123. package/Entry/package.json +0 -6
  124. package/EventHandler/package.json +0 -6
  125. package/Html/package.json +0 -6
  126. package/HtmlChunk/package.json +0 -6
  127. package/Hydrate/package.json +0 -6
  128. package/LICENSE +0 -21
  129. package/Many/package.json +0 -6
  130. package/Meta/package.json +0 -6
  131. package/Parser/package.json +0 -6
  132. package/Part/package.json +0 -6
  133. package/Placeholder/package.json +0 -6
  134. package/Platform/package.json +0 -6
  135. package/Render/package.json +0 -6
  136. package/RenderContext/package.json +0 -6
  137. package/RenderEvent/package.json +0 -6
  138. package/RenderQueue/package.json +0 -6
  139. package/RenderTemplate/package.json +0 -6
  140. package/Renderable/package.json +0 -6
  141. package/Template/package.json +0 -6
  142. package/Test/package.json +0 -6
  143. package/Vitest/package.json +0 -6
  144. package/compiler-tools/package.json +0 -6
  145. package/dist/cjs/Directive.js +0 -76
  146. package/dist/cjs/Directive.js.map +0 -1
  147. package/dist/cjs/ElementRef.js +0 -92
  148. package/dist/cjs/ElementRef.js.map +0 -1
  149. package/dist/cjs/ElementSource.js +0 -246
  150. package/dist/cjs/ElementSource.js.map +0 -1
  151. package/dist/cjs/Entry.js +0 -6
  152. package/dist/cjs/Entry.js.map +0 -1
  153. package/dist/cjs/EventHandler.js +0 -76
  154. package/dist/cjs/EventHandler.js.map +0 -1
  155. package/dist/cjs/Html.js +0 -224
  156. package/dist/cjs/Html.js.map +0 -1
  157. package/dist/cjs/HtmlChunk.js +0 -306
  158. package/dist/cjs/HtmlChunk.js.map +0 -1
  159. package/dist/cjs/Hydrate.js +0 -43
  160. package/dist/cjs/Hydrate.js.map +0 -1
  161. package/dist/cjs/Many.js +0 -66
  162. package/dist/cjs/Many.js.map +0 -1
  163. package/dist/cjs/Meta.js +0 -50
  164. package/dist/cjs/Meta.js.map +0 -1
  165. package/dist/cjs/Parser.js +0 -19
  166. package/dist/cjs/Parser.js.map +0 -1
  167. package/dist/cjs/Part.js +0 -6
  168. package/dist/cjs/Part.js.map +0 -1
  169. package/dist/cjs/Placeholder.js +0 -34
  170. package/dist/cjs/Placeholder.js.map +0 -1
  171. package/dist/cjs/Platform.js +0 -65
  172. package/dist/cjs/Platform.js.map +0 -1
  173. package/dist/cjs/Render.js +0 -50
  174. package/dist/cjs/Render.js.map +0 -1
  175. package/dist/cjs/RenderContext.js +0 -67
  176. package/dist/cjs/RenderContext.js.map +0 -1
  177. package/dist/cjs/RenderEvent.js +0 -52
  178. package/dist/cjs/RenderEvent.js.map +0 -1
  179. package/dist/cjs/RenderQueue.js +0 -343
  180. package/dist/cjs/RenderQueue.js.map +0 -1
  181. package/dist/cjs/RenderTemplate.js +0 -26
  182. package/dist/cjs/RenderTemplate.js.map +0 -1
  183. package/dist/cjs/Renderable.js +0 -6
  184. package/dist/cjs/Renderable.js.map +0 -1
  185. package/dist/cjs/Template.js +0 -305
  186. package/dist/cjs/Template.js.map +0 -1
  187. package/dist/cjs/Test.js +0 -184
  188. package/dist/cjs/Test.js.map +0 -1
  189. package/dist/cjs/Vitest.js +0 -52
  190. package/dist/cjs/Vitest.js.map +0 -1
  191. package/dist/cjs/compiler-tools.js +0 -100
  192. package/dist/cjs/compiler-tools.js.map +0 -1
  193. package/dist/cjs/index.js +0 -138
  194. package/dist/cjs/index.js.map +0 -1
  195. package/dist/cjs/internal/EventSource.js +0 -129
  196. package/dist/cjs/internal/EventSource.js.map +0 -1
  197. package/dist/cjs/internal/HydrateContext.js +0 -13
  198. package/dist/cjs/internal/HydrateContext.js.map +0 -1
  199. package/dist/cjs/internal/browser.js +0 -110
  200. package/dist/cjs/internal/browser.js.map +0 -1
  201. package/dist/cjs/internal/character-entities.js +0 -2141
  202. package/dist/cjs/internal/character-entities.js.map +0 -1
  203. package/dist/cjs/internal/chunks.js +0 -68
  204. package/dist/cjs/internal/chunks.js.map +0 -1
  205. package/dist/cjs/internal/errors.js +0 -52
  206. package/dist/cjs/internal/errors.js.map +0 -1
  207. package/dist/cjs/internal/indexRefCounter.js +0 -52
  208. package/dist/cjs/internal/indexRefCounter.js.map +0 -1
  209. package/dist/cjs/internal/module-augmentation.js +0 -6
  210. package/dist/cjs/internal/module-augmentation.js.map +0 -1
  211. package/dist/cjs/internal/parser.js +0 -568
  212. package/dist/cjs/internal/parser.js.map +0 -1
  213. package/dist/cjs/internal/parser2.js +0 -382
  214. package/dist/cjs/internal/parser2.js.map +0 -1
  215. package/dist/cjs/internal/server-parts.js +0 -124
  216. package/dist/cjs/internal/server-parts.js.map +0 -1
  217. package/dist/cjs/internal/server.js +0 -48
  218. package/dist/cjs/internal/server.js.map +0 -1
  219. package/dist/cjs/internal/utils.js +0 -136
  220. package/dist/cjs/internal/utils.js.map +0 -1
  221. package/dist/cjs/internal/v2/SyncPart.js +0 -6
  222. package/dist/cjs/internal/v2/SyncPart.js.map +0 -1
  223. package/dist/cjs/internal/v2/helpers.js +0 -15
  224. package/dist/cjs/internal/v2/helpers.js.map +0 -1
  225. package/dist/cjs/internal/v2/hydration-template.js +0 -269
  226. package/dist/cjs/internal/v2/hydration-template.js.map +0 -1
  227. package/dist/cjs/internal/v2/parts.js +0 -169
  228. package/dist/cjs/internal/v2/parts.js.map +0 -1
  229. package/dist/cjs/internal/v2/render-entry.js +0 -110
  230. package/dist/cjs/internal/v2/render-entry.js.map +0 -1
  231. package/dist/cjs/internal/v2/render-sync-parts.js +0 -318
  232. package/dist/cjs/internal/v2/render-sync-parts.js.map +0 -1
  233. package/dist/cjs/internal/v2/render.js +0 -592
  234. package/dist/cjs/internal/v2/render.js.map +0 -1
  235. package/dist/cjs/internal/v2/sync-parts.js +0 -115
  236. package/dist/cjs/internal/v2/sync-parts.js.map +0 -1
  237. package/dist/dts/Directive.d.ts +0 -70
  238. package/dist/dts/Directive.d.ts.map +0 -1
  239. package/dist/dts/ElementRef.d.ts +0 -42
  240. package/dist/dts/ElementRef.d.ts.map +0 -1
  241. package/dist/dts/ElementSource.d.ts +0 -79
  242. package/dist/dts/ElementSource.d.ts.map +0 -1
  243. package/dist/dts/Entry.d.ts +0 -26
  244. package/dist/dts/Entry.d.ts.map +0 -1
  245. package/dist/dts/EventHandler.d.ts +0 -73
  246. package/dist/dts/EventHandler.d.ts.map +0 -1
  247. package/dist/dts/Html.d.ts +0 -35
  248. package/dist/dts/Html.d.ts.map +0 -1
  249. package/dist/dts/HtmlChunk.d.ts +0 -56
  250. package/dist/dts/HtmlChunk.d.ts.map +0 -1
  251. package/dist/dts/Hydrate.d.ts +0 -19
  252. package/dist/dts/Hydrate.d.ts.map +0 -1
  253. package/dist/dts/Many.d.ts +0 -32
  254. package/dist/dts/Many.d.ts.map +0 -1
  255. package/dist/dts/Meta.d.ts +0 -33
  256. package/dist/dts/Meta.d.ts.map +0 -1
  257. package/dist/dts/Parser.d.ts +0 -13
  258. package/dist/dts/Parser.d.ts.map +0 -1
  259. package/dist/dts/Part.d.ts +0 -121
  260. package/dist/dts/Part.d.ts.map +0 -1
  261. package/dist/dts/Placeholder.d.ts +0 -48
  262. package/dist/dts/Placeholder.d.ts.map +0 -1
  263. package/dist/dts/Platform.d.ts +0 -21
  264. package/dist/dts/Platform.d.ts.map +0 -1
  265. package/dist/dts/Render.d.ts +0 -31
  266. package/dist/dts/Render.d.ts.map +0 -1
  267. package/dist/dts/RenderContext.d.ts +0 -70
  268. package/dist/dts/RenderContext.d.ts.map +0 -1
  269. package/dist/dts/RenderEvent.d.ts +0 -42
  270. package/dist/dts/RenderEvent.d.ts.map +0 -1
  271. package/dist/dts/RenderQueue.d.ts +0 -103
  272. package/dist/dts/RenderQueue.d.ts.map +0 -1
  273. package/dist/dts/RenderTemplate.d.ts +0 -25
  274. package/dist/dts/RenderTemplate.d.ts.map +0 -1
  275. package/dist/dts/Renderable.d.ts +0 -28
  276. package/dist/dts/Renderable.d.ts.map +0 -1
  277. package/dist/dts/Template.d.ts.map +0 -1
  278. package/dist/dts/Test.d.ts +0 -85
  279. package/dist/dts/Test.d.ts.map +0 -1
  280. package/dist/dts/Vitest.d.ts +0 -43
  281. package/dist/dts/Vitest.d.ts.map +0 -1
  282. package/dist/dts/compiler-tools.d.ts +0 -143
  283. package/dist/dts/compiler-tools.d.ts.map +0 -1
  284. package/dist/dts/index.d.ts +0 -65
  285. package/dist/dts/index.d.ts.map +0 -1
  286. package/dist/dts/internal/EventSource.d.ts +0 -13
  287. package/dist/dts/internal/EventSource.d.ts.map +0 -1
  288. package/dist/dts/internal/HydrateContext.d.ts +0 -2
  289. package/dist/dts/internal/HydrateContext.d.ts.map +0 -1
  290. package/dist/dts/internal/browser.d.ts +0 -8
  291. package/dist/dts/internal/browser.d.ts.map +0 -1
  292. package/dist/dts/internal/character-entities.d.ts +0 -2133
  293. package/dist/dts/internal/character-entities.d.ts.map +0 -1
  294. package/dist/dts/internal/chunks.d.ts +0 -23
  295. package/dist/dts/internal/chunks.d.ts.map +0 -1
  296. package/dist/dts/internal/errors.d.ts +0 -22
  297. package/dist/dts/internal/errors.d.ts.map +0 -1
  298. package/dist/dts/internal/indexRefCounter.d.ts +0 -7
  299. package/dist/dts/internal/indexRefCounter.d.ts.map +0 -1
  300. package/dist/dts/internal/module-augmentation.d.ts +0 -32
  301. package/dist/dts/internal/module-augmentation.d.ts.map +0 -1
  302. package/dist/dts/internal/parser.d.ts +0 -33
  303. package/dist/dts/internal/parser.d.ts.map +0 -1
  304. package/dist/dts/internal/parser2.d.ts +0 -12
  305. package/dist/dts/internal/parser2.d.ts.map +0 -1
  306. package/dist/dts/internal/server-parts.d.ts +0 -223
  307. package/dist/dts/internal/server-parts.d.ts.map +0 -1
  308. package/dist/dts/internal/server.d.ts +0 -5
  309. package/dist/dts/internal/server.d.ts.map +0 -1
  310. package/dist/dts/internal/utils.d.ts +0 -19
  311. package/dist/dts/internal/utils.d.ts.map +0 -1
  312. package/dist/dts/internal/v2/SyncPart.d.ts +0 -87
  313. package/dist/dts/internal/v2/SyncPart.d.ts.map +0 -1
  314. package/dist/dts/internal/v2/helpers.d.ts +0 -3
  315. package/dist/dts/internal/v2/helpers.d.ts.map +0 -1
  316. package/dist/dts/internal/v2/hydration-template.d.ts.map +0 -1
  317. package/dist/dts/internal/v2/parts.d.ts +0 -245
  318. package/dist/dts/internal/v2/parts.d.ts.map +0 -1
  319. package/dist/dts/internal/v2/render-entry.d.ts +0 -6
  320. package/dist/dts/internal/v2/render-entry.d.ts.map +0 -1
  321. package/dist/dts/internal/v2/render-sync-parts.d.ts +0 -22
  322. package/dist/dts/internal/v2/render-sync-parts.d.ts.map +0 -1
  323. package/dist/dts/internal/v2/render.d.ts +0 -83
  324. package/dist/dts/internal/v2/render.d.ts.map +0 -1
  325. package/dist/dts/internal/v2/sync-parts.d.ts +0 -129
  326. package/dist/dts/internal/v2/sync-parts.d.ts.map +0 -1
  327. package/dist/esm/Directive.js +0 -64
  328. package/dist/esm/Directive.js.map +0 -1
  329. package/dist/esm/ElementRef.js +0 -76
  330. package/dist/esm/ElementRef.js.map +0 -1
  331. package/dist/esm/ElementSource.js +0 -246
  332. package/dist/esm/ElementSource.js.map +0 -1
  333. package/dist/esm/Entry.js +0 -2
  334. package/dist/esm/Entry.js.map +0 -1
  335. package/dist/esm/EventHandler.js +0 -68
  336. package/dist/esm/EventHandler.js.map +0 -1
  337. package/dist/esm/Html.js +0 -230
  338. package/dist/esm/Html.js.map +0 -1
  339. package/dist/esm/HtmlChunk.js +0 -330
  340. package/dist/esm/HtmlChunk.js.map +0 -1
  341. package/dist/esm/Hydrate.js +0 -31
  342. package/dist/esm/Hydrate.js.map +0 -1
  343. package/dist/esm/Many.js +0 -54
  344. package/dist/esm/Many.js.map +0 -1
  345. package/dist/esm/Meta.js +0 -40
  346. package/dist/esm/Meta.js.map +0 -1
  347. package/dist/esm/Parser.js +0 -13
  348. package/dist/esm/Parser.js.map +0 -1
  349. package/dist/esm/Part.js +0 -5
  350. package/dist/esm/Part.js.map +0 -1
  351. package/dist/esm/Placeholder.js +0 -26
  352. package/dist/esm/Placeholder.js.map +0 -1
  353. package/dist/esm/Platform.js +0 -42
  354. package/dist/esm/Platform.js.map +0 -1
  355. package/dist/esm/Render.js +0 -36
  356. package/dist/esm/Render.js.map +0 -1
  357. package/dist/esm/RenderContext.js +0 -54
  358. package/dist/esm/RenderContext.js.map +0 -1
  359. package/dist/esm/RenderEvent.js +0 -43
  360. package/dist/esm/RenderEvent.js.map +0 -1
  361. package/dist/esm/RenderQueue.js +0 -338
  362. package/dist/esm/RenderQueue.js.map +0 -1
  363. package/dist/esm/RenderTemplate.js +0 -16
  364. package/dist/esm/RenderTemplate.js.map +0 -1
  365. package/dist/esm/Renderable.js +0 -2
  366. package/dist/esm/Renderable.js.map +0 -1
  367. package/dist/esm/Template.js.map +0 -1
  368. package/dist/esm/Test.js +0 -167
  369. package/dist/esm/Test.js.map +0 -1
  370. package/dist/esm/Vitest.js +0 -44
  371. package/dist/esm/Vitest.js.map +0 -1
  372. package/dist/esm/compiler-tools.js +0 -91
  373. package/dist/esm/compiler-tools.js.map +0 -1
  374. package/dist/esm/index.js +0 -65
  375. package/dist/esm/index.js.map +0 -1
  376. package/dist/esm/internal/EventSource.js +0 -126
  377. package/dist/esm/internal/EventSource.js.map +0 -1
  378. package/dist/esm/internal/HydrateContext.js +0 -7
  379. package/dist/esm/internal/HydrateContext.js.map +0 -1
  380. package/dist/esm/internal/browser.js +0 -103
  381. package/dist/esm/internal/browser.js.map +0 -1
  382. package/dist/esm/internal/character-entities.js +0 -2134
  383. package/dist/esm/internal/character-entities.js.map +0 -1
  384. package/dist/esm/internal/chunks.js +0 -60
  385. package/dist/esm/internal/chunks.js.map +0 -1
  386. package/dist/esm/internal/errors.js +0 -46
  387. package/dist/esm/internal/errors.js.map +0 -1
  388. package/dist/esm/internal/indexRefCounter.js +0 -47
  389. package/dist/esm/internal/indexRefCounter.js.map +0 -1
  390. package/dist/esm/internal/module-augmentation.js +0 -2
  391. package/dist/esm/internal/module-augmentation.js.map +0 -1
  392. package/dist/esm/internal/parser.js +0 -596
  393. package/dist/esm/internal/parser.js.map +0 -1
  394. package/dist/esm/internal/parser2.js +0 -393
  395. package/dist/esm/internal/parser2.js.map +0 -1
  396. package/dist/esm/internal/server-parts.js +0 -109
  397. package/dist/esm/internal/server-parts.js.map +0 -1
  398. package/dist/esm/internal/server.js +0 -22
  399. package/dist/esm/internal/server.js.map +0 -1
  400. package/dist/esm/internal/utils.js +0 -119
  401. package/dist/esm/internal/utils.js.map +0 -1
  402. package/dist/esm/internal/v2/SyncPart.js +0 -5
  403. package/dist/esm/internal/v2/SyncPart.js.map +0 -1
  404. package/dist/esm/internal/v2/helpers.js +0 -12
  405. package/dist/esm/internal/v2/helpers.js.map +0 -1
  406. package/dist/esm/internal/v2/hydration-template.js.map +0 -1
  407. package/dist/esm/internal/v2/parts.js +0 -150
  408. package/dist/esm/internal/v2/parts.js.map +0 -1
  409. package/dist/esm/internal/v2/render-entry.js +0 -102
  410. package/dist/esm/internal/v2/render-entry.js.map +0 -1
  411. package/dist/esm/internal/v2/render-sync-parts.js +0 -265
  412. package/dist/esm/internal/v2/render-sync-parts.js.map +0 -1
  413. package/dist/esm/internal/v2/render.js +0 -521
  414. package/dist/esm/internal/v2/render.js.map +0 -1
  415. package/dist/esm/internal/v2/sync-parts.js +0 -102
  416. package/dist/esm/internal/v2/sync-parts.js.map +0 -1
  417. package/dist/esm/package.json +0 -4
  418. package/src/Directive.ts +0 -114
  419. package/src/ElementRef.ts +0 -148
  420. package/src/ElementSource.ts +0 -510
  421. package/src/Entry.ts +0 -28
  422. package/src/Hydrate.ts +0 -51
  423. package/src/Many.ts +0 -161
  424. package/src/Meta.ts +0 -45
  425. package/src/Part.ts +0 -154
  426. package/src/Placeholder.ts +0 -78
  427. package/src/Platform.ts +0 -70
  428. package/src/RenderContext.ts +0 -121
  429. package/src/Test.ts +0 -354
  430. package/src/Vitest.ts +0 -141
  431. package/src/compiler-tools.ts +0 -250
  432. package/src/internal/EventSource.ts +0 -188
  433. package/src/internal/HydrateContext.ts +0 -22
  434. package/src/internal/browser.ts +0 -138
  435. package/src/internal/character-entities.ts +0 -2136
  436. package/src/internal/chunks.ts +0 -89
  437. package/src/internal/errors.ts +0 -49
  438. package/src/internal/external.d.ts +0 -11
  439. package/src/internal/indexRefCounter.ts +0 -54
  440. package/src/internal/module-augmentation.ts +0 -44
  441. package/src/internal/parser.ts +0 -757
  442. package/src/internal/parser2.ts +0 -468
  443. package/src/internal/server-parts.ts +0 -161
  444. package/src/internal/server.ts +0 -37
  445. package/src/internal/utils.ts +0 -153
  446. package/src/internal/v2/SyncPart.ts +0 -112
  447. package/src/internal/v2/helpers.ts +0 -13
  448. package/src/internal/v2/hydration-template.ts +0 -308
  449. package/src/internal/v2/parts.ts +0 -254
  450. package/src/internal/v2/render-entry.ts +0 -131
  451. package/src/internal/v2/render-sync-parts.ts +0 -440
  452. package/src/internal/v2/render.ts +0 -813
  453. package/src/internal/v2/sync-parts.ts +0 -133
@@ -1,447 +1,352 @@
1
- /**
2
- * The context in which templates are rendered within
3
- * @since 1.0.0
4
- */
1
+ import { constVoid } from "effect/Function";
5
2
 
6
- import * as Context from "@typed/context"
7
- import * as Idle from "@typed/fx/Idle"
8
- import * as Effect from "effect/Effect"
9
- import * as FiberRef from "effect/FiberRef"
10
- import { dual } from "effect/Function"
11
- import type * as Layer from "effect/Layer"
12
- import * as Scope from "effect/Scope"
3
+ export const RenderQueueTypeId = "@typed/template/RenderQueue";
4
+ export type RenderQueueTypeId = typeof RenderQueueTypeId;
13
5
 
14
- /**
15
- * @since 1.0.0
16
- */
17
- export const DEFAULT_PRIORITY = 10
6
+ type Entry = { task: () => void; dispose: () => void };
18
7
 
19
8
  /**
20
- * The context in which templates are rendered within
9
+ * An abstract base class for managing the execution of rendering tasks.
10
+ * It allows prioritizing updates and scheduling them using different strategies
11
+ * (e.g., `requestAnimationFrame`, `requestIdleCallback`, `setTimeout`, or synchronous execution).
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { MixedRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
16
+ *
17
+ * const queue = new MixedRenderQueue()
18
+ *
19
+ * // Add a high-priority synchronous task
20
+ * queue.add("task1", () => console.log("High priority"), () => {}, RenderPriority.Sync)
21
+ *
22
+ * // Add a medium-priority RAF task
23
+ * queue.add("task2", () => console.log("Medium priority"), () => {}, RenderPriority.Raf(5))
24
+ *
25
+ * // Add a low-priority idle task
26
+ * queue.add("task3", () => console.log("Low priority"), () => {}, RenderPriority.Idle(1))
27
+ * ```
28
+ *
21
29
  * @since 1.0.0
30
+ * @category models
22
31
  */
23
- export const RenderQueue: Context.Tagged<RenderQueue, RenderQueue> = Context.Tagged<RenderQueue>(
24
- "@typed/template/RenderQueue"
25
- )
32
+ export abstract class RenderQueue implements Disposable {
33
+ protected readonly buckets: Array<KeyedPriorityBucket<Entry>> = [];
34
+ protected scheduled: Disposable | undefined = undefined;
26
35
 
27
- /**
28
- * @since 1.0.0
29
- */
30
- export const currentPriority: FiberRef.FiberRef<number> = FiberRef.unsafeMake(DEFAULT_PRIORITY)
36
+ readonly [RenderQueueTypeId]: RenderQueueTypeId = RenderQueueTypeId;
31
37
 
32
- /**
33
- * @since 1.0.0
34
- */
35
- export interface RenderQueue {
36
- readonly add: (part: unknown, task: () => void, priority: number) => Effect.Effect<void, never, Scope.Scope>
38
+ /**
39
+ * Adds a task to the render queue.
40
+ *
41
+ * @param key - A unique key to identify the task (used for deduplication/cancellation).
42
+ * @param task - The function to execute.
43
+ * @param dispose - A cleanup function to run after the task is executed.
44
+ * @param priority - The priority of the task. Higher priority tasks may run sooner depending on the implementation.
45
+ * @returns A Disposable that can be used to cancel the task.
46
+ */
47
+ readonly add: (
48
+ key: unknown,
49
+ task: () => void,
50
+ dispose: () => void,
51
+ priority: number,
52
+ ) => Disposable = (key, task, dispose, priority) => {
53
+ insert(this.buckets, priority, key, { task, dispose }, (entry) => entry.dispose());
54
+ this.scheduleNext();
55
+ return disposable(() => remove(this.buckets, priority, key));
56
+ };
57
+
58
+ readonly [Symbol.dispose]: () => void = () => {
59
+ if (this.scheduled) {
60
+ dispose(this.scheduled);
61
+ this.scheduled = undefined;
62
+ }
63
+ this.buckets.length = 0;
64
+ };
65
+
66
+ protected abstract schedule(task: (deadline: IdleDeadline) => void): Disposable;
67
+
68
+ protected runTasks(deadline: IdleDeadline): void {
69
+ this.scheduled = undefined;
70
+
71
+ while (shouldContinue(deadline) && this.buckets.length > 0) {
72
+ const [_priority, map] = this.buckets.shift()!;
73
+ for (const { dispose, task } of map.values()) {
74
+ task();
75
+ dispose();
76
+ }
77
+ }
78
+
79
+ this.scheduleNext();
80
+ }
81
+
82
+ private scheduleNext(): void {
83
+ if (this.buckets.length === 0) {
84
+ dispose(this);
85
+ return;
86
+ }
87
+
88
+ if (!this.scheduled) {
89
+ this.scheduled = this.schedule((deadline) => this.runTasks(deadline));
90
+ }
91
+ }
37
92
  }
38
93
 
94
+ // 16ms to match 60fps
95
+ const DEFAULT_DURATION_ALLOWED = 16;
96
+ const SYNC_DEADLINE: IdleDeadline = { timeRemaining: () => Infinity, didTimeout: false };
97
+
39
98
  /**
99
+ * A RenderQueue that executes tasks synchronously and immediately.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * import { SyncRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
104
+ *
105
+ * const queue = new SyncRenderQueue()
106
+ * queue.add("task", () => console.log("Immediate"), () => {}, RenderPriority.Sync)
107
+ * ```
108
+ *
40
109
  * @since 1.0.0
110
+ * @category models
41
111
  */
42
- export interface IdleRenderQueueOptions extends IdleRequestOptions {
43
- readonly scope: Scope.Scope
112
+ export class SyncRenderQueue extends RenderQueue {
113
+ protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
114
+ task(SYNC_DEADLINE);
115
+ return disposable(constVoid);
116
+ }
44
117
  }
45
118
 
46
119
  /**
47
- * @since 1.0.0
120
+ * A RenderQueue that schedules tasks using `setTimeout(..., 0)`.
48
121
  */
49
- export const unsafeMakeIdleRenderQueue = ({ scope, ...options }: IdleRenderQueueOptions): RenderQueue =>
50
- new IdleImpl(scope, options)
122
+ export class SetTimeoutRenderQueue extends RenderQueue {
123
+ protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
124
+ const id = setTimeout(
125
+ () => task(idleDealineFromTime(performance.now(), DEFAULT_DURATION_ALLOWED)),
126
+ 0,
127
+ );
128
+ return disposable(() => clearTimeout(id));
129
+ }
130
+ }
51
131
 
52
132
  /**
133
+ * A RenderQueue that schedules tasks using `requestAnimationFrame`.
134
+ * Good for visual updates that should happen before the next repaint.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * import { RequestAnimationFrameRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
139
+ *
140
+ * const queue = new RequestAnimationFrameRenderQueue(16) // 16ms budget
141
+ * queue.add("update", () => updateDOM(), () => {}, RenderPriority.Raf(5))
142
+ * ```
143
+ *
53
144
  * @since 1.0.0
145
+ * @category models
54
146
  */
55
- export const unsafeMakeRafRenderQueue = (scope: Scope.Scope): RenderQueue => new RafImpl(scope)
147
+ export class RequestAnimationFrameRenderQueue extends RenderQueue {
148
+ readonly durationAllowed: number;
149
+ constructor(durationAllowed: number = DEFAULT_DURATION_ALLOWED) {
150
+ super();
151
+ this.durationAllowed = durationAllowed;
152
+ }
56
153
 
57
- /**
58
- * @since 1.0.0
59
- */
60
- export const unsafeMakeMicrotaskRenderQueue = (scope: Scope.Scope): RenderQueue => new MicroTaskImpl(scope)
154
+ protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
155
+ const id = requestAnimationFrame((time) =>
156
+ task(idleDealineFromTime(time, this.durationAllowed)),
157
+ );
158
+ return disposable(() => cancelAnimationFrame(id));
159
+ }
160
+ }
61
161
 
62
162
  /**
63
- * @since 1.0.0
163
+ * A RenderQueue that schedules tasks using `requestIdleCallback`.
164
+ * Good for low-priority background work.
64
165
  */
65
- export const unsafeMakeSyncRenderQueue = (): RenderQueue => new SyncImpl()
166
+ export class RequestIdleCallbackRenderQueue extends RenderQueue {
167
+ protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
168
+ const id = requestIdleCallback(task);
169
+ return disposable(() => cancelIdleCallback(id));
170
+ }
171
+ }
66
172
 
67
- /**
68
- * @since 1.0.0
69
- */
70
- export const idle = (options?: IdleRequestOptions): Layer.Layer<RenderQueue> =>
71
- RenderQueue.scoped(
72
- Effect.scopeWith((scope) => Effect.succeed(unsafeMakeIdleRenderQueue({ scope, ...options })))
73
- )
173
+ const NONE = disposable(constVoid);
74
174
 
75
175
  /**
176
+ * A composite RenderQueue that directs tasks to different queues based on their priority.
177
+ * - High priority: Sync
178
+ * - Medium priority: RAF (or setTimeout fallback)
179
+ * - Low priority: IdleCallback (or setTimeout fallback)
180
+ *
181
+ * @example
182
+ * ```ts
183
+ * import { MixedRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
184
+ *
185
+ * const queue = new MixedRenderQueue()
186
+ *
187
+ * // Tasks are automatically routed to the appropriate queue
188
+ * queue.add("sync", () => {}, () => {}, RenderPriority.Sync)
189
+ * queue.add("raf", () => {}, () => {}, RenderPriority.Raf(5))
190
+ * queue.add("idle", () => {}, () => {}, RenderPriority.Idle(1))
191
+ * ```
192
+ *
76
193
  * @since 1.0.0
194
+ * @category models
77
195
  */
78
- export const raf: Layer.Layer<RenderQueue> = RenderQueue.scoped(
79
- Effect.scopeWith((scope) => Effect.succeed(unsafeMakeRafRenderQueue(scope)))
80
- )
196
+ export class MixedRenderQueue extends RenderQueue {
197
+ private readonly high: RenderQueue;
198
+ private readonly mid: RenderQueue;
199
+ private readonly low: RenderQueue;
200
+
201
+ constructor(durationAllowed: number = DEFAULT_DURATION_ALLOWED) {
202
+ super();
203
+ this.high = new SyncRenderQueue();
204
+ this.mid =
205
+ typeof requestAnimationFrame === "function"
206
+ ? new RequestAnimationFrameRenderQueue(durationAllowed)
207
+ : new SetTimeoutRenderQueue();
208
+ this.low =
209
+ typeof requestIdleCallback === "function"
210
+ ? new RequestIdleCallbackRenderQueue()
211
+ : new SetTimeoutRenderQueue();
212
+ }
81
213
 
82
- /**
83
- * @since 1.0.0
84
- */
85
- export const microtask: Layer.Layer<RenderQueue> = RenderQueue.scoped(
86
- Effect.scopeWith((scope) => Effect.succeed(unsafeMakeMicrotaskRenderQueue(scope)))
87
- )
214
+ override readonly add = (
215
+ key: unknown,
216
+ task: () => void,
217
+ dispose: () => void,
218
+ priority: number,
219
+ ): Disposable => {
220
+ if (priority === RenderPriority.Sync) {
221
+ return this.high.add(key, task, dispose, priority);
222
+ } else if (
223
+ priority > RenderPriority.Sync &&
224
+ priority <= RenderPriority.Raf(RAF_PRIORITY_RANGE)
225
+ ) {
226
+ return this.mid.add(key, task, dispose, priority);
227
+ } else {
228
+ return this.low.add(key, task, dispose, priority);
229
+ }
230
+ };
88
231
 
89
- /**
90
- * @since 1.0.0
91
- */
92
- export const sync: Layer.Layer<RenderQueue> = RenderQueue.layer(Effect.sync(unsafeMakeSyncRenderQueue))
232
+ // We let the other queues handle the actual scheduling
233
+ protected schedule(): Disposable {
234
+ return NONE;
235
+ }
93
236
 
94
- const MICRO_TASK_END = DEFAULT_PRIORITY - 1
95
- const RAF_END = DEFAULT_PRIORITY + 9
96
- const IDLE_START = RAF_END + 1
237
+ override [Symbol.dispose]: () => void = () => {
238
+ dispose(this.high);
239
+ dispose(this.mid);
240
+ dispose(this.low);
241
+ };
242
+ }
97
243
 
98
- /**
99
- * @since 1.0.0
100
- */
101
- export const mixed = (options?: IdleRequestOptions): Layer.Layer<RenderQueue> =>
102
- RenderQueue.scoped(Effect.gen(function*() {
103
- const scope = yield* Effect.scope
104
- const queues: Array<readonly [priorityRange: readonly [number, number], RenderQueue]> = [
105
- [[-1, -1], new SyncImpl()],
106
- [[0, MICRO_TASK_END], new MicroTaskImpl(scope)],
107
- [[DEFAULT_PRIORITY, RAF_END], new RafImpl(scope)],
108
- [[IDLE_START, Number.MAX_SAFE_INTEGER], new IdleImpl(scope, options)]
109
- ]
110
-
111
- return new MixedImpl(queues)
112
- }))
244
+ const RAF_PRIORITY_RANGE = 10;
113
245
 
114
246
  /**
247
+ * Defines priority levels for rendering tasks.
248
+ *
249
+ * @example
250
+ * ```ts
251
+ * import { RenderPriority } from "@typed/template/RenderQueue"
252
+ *
253
+ * // Synchronous execution (highest priority)
254
+ * const syncPriority = RenderPriority.Sync
255
+ *
256
+ * // RequestAnimationFrame priority (0-10)
257
+ * const rafPriority = RenderPriority.Raf(5)
258
+ *
259
+ * // Idle callback priority (lowest priority)
260
+ * const idlePriority = RenderPriority.Idle(1)
261
+ * ```
262
+ *
115
263
  * @since 1.0.0
264
+ * @category utilities
116
265
  */
117
- export const Priority = {
118
- Sync: -1,
266
+ export const RenderPriority = {
119
267
  /**
120
- * @example
121
- * RenderPriority.MicroTask(0-9)
268
+ * Immediate, synchronous execution.
122
269
  */
123
- MicroTask: (priority: number) => Math.min(Math.max(0, priority), MICRO_TASK_END),
270
+ Sync: -1,
124
271
  /**
125
- * @example
126
- * RenderPriority.Raf(0-9)
272
+ * Scheduled via requestAnimationFrame.
273
+ * @param priority - A value between 0 and 10.
127
274
  */
128
- Raf: (priority: number) => Math.min(Math.max(DEFAULT_PRIORITY, DEFAULT_PRIORITY + priority), RAF_END),
275
+ Raf: (priority: number) => Math.max(0, Math.min(priority, RAF_PRIORITY_RANGE)),
129
276
  /**
130
- * @example
131
- * RenderPriority.Idle(0-9)
277
+ * Scheduled via requestIdleCallback.
132
278
  */
133
- Idle: (priority: number) => Math.max(IDLE_START, IDLE_START + priority)
134
- } as const
135
-
136
- class PriorityQueue {
137
- tasks: Map<unknown, () => void> = new Map()
138
- priority: Map<unknown, number> = new Map<unknown, number>()
139
- priorities: Map<number, Set<unknown>> = new Map()
140
-
141
- add(part: unknown, task: () => void, priority: number) {
142
- this.tasks.set(part, task)
143
- this.setPriority(part, priority)
144
- }
145
-
146
- get(part: unknown) {
147
- return this.tasks.get(part)
148
- }
149
-
150
- delete(part: unknown) {
151
- this.tasks.delete(part)
152
- const priority = this.priority.get(part)
153
- if (priority === undefined) {
154
- return false
155
- } else {
156
- this.priorities.get(priority)?.delete(part)
157
- this.priority.delete(part)
158
- return true
159
- }
160
- }
161
-
162
- get isEmpty() {
163
- return this.priorities.size === 0
164
- }
165
-
166
- *entries() {
167
- for (const priority of Array.from(this.priorities.keys()).sort((a, b) => a - b)) {
168
- const parts = this.priorities.get(priority)!
169
- this.priorities.delete(priority)
170
- yield this.getTasks(parts)
171
- }
172
- }
173
-
174
- private getTasks(parts: Set<unknown>) {
175
- return Array.from(parts.values()).flatMap((part) => {
176
- const task = this.tasks.get(part)
177
- if (task === undefined) return []
178
- this.tasks.delete(part)
179
- this.priority.delete(part)
180
- return [task]
181
- })
182
- }
183
-
184
- private setPriority(task: unknown, priority: number) {
185
- const current = this.priority.get(task)
186
- if (current === undefined) {
187
- this.priority.set(task, priority)
188
- this.addTaskToPriority(task, priority)
189
- return priority
190
- } else if (priority < current) {
191
- this.priorities.get(current)?.delete(task)
192
- this.priority.set(task, priority)
193
- this.addTaskToPriority(task, priority)
194
- return priority
195
- } else {
196
- return current
197
- }
198
- }
199
-
200
- private addTaskToPriority(task: unknown, priority: number) {
201
- let set = this.priorities.get(priority)
202
- if (set === undefined) {
203
- set = new Set()
204
- this.priorities.set(priority, set)
205
- }
206
- set.add(task)
207
- }
279
+ Idle: (priority: number) => RAF_PRIORITY_RANGE + priority,
280
+ } as const;
281
+
282
+ function idleDealineFromTime(startTime: number, durationAllowed: number): IdleDeadline {
283
+ return {
284
+ timeRemaining: () => {
285
+ const elapsed = performance.now() - startTime;
286
+ return Math.max(0, durationAllowed - elapsed);
287
+ },
288
+ didTimeout: false,
289
+ };
208
290
  }
209
291
 
210
- abstract class BaseImpl implements RenderQueue {
211
- queue = new PriorityQueue()
212
- scheduled = false
213
-
214
- constructor(readonly scope: Scope.Scope) {
215
- this.add.bind(this)
216
- }
217
-
218
- add(part: unknown, task: () => void, priority: number) {
219
- return Effect.suspend(() => {
220
- this.queue.add(part, task, priority)
221
-
222
- return Effect.zipRight(
223
- Effect.addFinalizer(() =>
224
- Effect.sync(() => {
225
- const currentTask = this.queue.get(part)
226
- // If the current task is still the same we'll delete it from the queue
227
- if (currentTask === task) {
228
- this.queue.delete(part)
229
- }
230
- })
231
- ),
232
- this.scheduleNextRun
233
- )
234
- })
235
- }
236
-
237
- scheduleNextRun = Effect.suspend(() => {
238
- if (this.queue.isEmpty || this.scheduled) return Effect.void
239
-
240
- this.scheduled = true
241
-
242
- return this.run.pipe(
243
- Scope.extend(this.scope),
244
- Effect.forkIn(this.scope)
245
- )
246
- })
247
-
248
- abstract run: Effect.Effect<void, never, Scope.Scope>
249
-
250
- protected runTasks = (iterator: Iterator<Array<() => void>>) => {
251
- const result = iterator.next()
252
-
253
- if (result.done) return false
254
- else {
255
- for (const task of result.value) {
256
- this.tryRunTask(task)
257
- }
258
-
259
- return true
260
- }
261
- }
262
-
263
- protected tryRunTask = (task: () => void) => {
264
- try {
265
- task()
266
- } catch (error) {
267
- // TODO: We should probably be able to report this back to a template
268
- console.error(error)
269
- }
270
- }
292
+ function disposable(f: () => void): Disposable {
293
+ return {
294
+ [Symbol.dispose]: f,
295
+ };
271
296
  }
272
297
 
273
- class IdleImpl extends BaseImpl implements RenderQueue {
274
- constructor(
275
- scope: Scope.Scope,
276
- readonly options?: IdleRequestOptions
277
- ) {
278
- super(scope)
279
- }
280
-
281
- run: Effect.Effect<void, never, Scope.Scope> = Effect.suspend(() => {
282
- return Effect.flatMap(
283
- Idle.whenIdle(this.options),
284
- (deadline) =>
285
- Effect.suspend(() => {
286
- const iterator = this.queue.entries()
287
-
288
- while (Idle.shouldContinue(deadline) && this.runTasks(iterator)) {
289
- // Continue
290
- }
291
-
292
- // If we have more work to do, schedule another run
293
- if (!this.queue.isEmpty) {
294
- return this.run
295
- }
296
-
297
- this.scheduled = false
298
-
299
- return Effect.void
300
- })
301
- )
302
- })
298
+ function dispose(self: Disposable): void {
299
+ if (self === NONE) return;
300
+ self[Symbol.dispose]();
303
301
  }
304
302
 
305
- class RafImpl extends BaseImpl implements RenderQueue {
306
- private _set: ((callback: FrameRequestCallback) => number) | typeof setTimeout
307
- private _clear: (handle: number) => void
308
-
309
- constructor(
310
- readonly scope: Scope.Scope
311
- ) {
312
- super(scope)
313
-
314
- const [set, clear] = typeof globalThis.requestAnimationFrame === "function"
315
- ? [requestAnimationFrame.bind(globalThis), cancelAnimationFrame.bind(globalThis)]
316
- : [setTimeout, clearTimeout]
317
- this._set = set
318
- this._clear = clear
319
- }
320
-
321
- run: Effect.Effect<void> = Effect.async((cb) => {
322
- const id = this._set(() => {
323
- this.runAllTasks()
324
- return cb(Effect.void)
325
- })
326
- return Effect.sync(() => {
327
- this.scheduled = false
328
- this._clear(id)
329
- })
330
- })
331
-
332
- private runAllTasks = () => {
333
- const iterator = this.queue.entries()
334
- while (this.runTasks(iterator)) {
335
- // Continue
336
- }
337
-
338
- this.scheduled = false
339
- }
303
+ function shouldContinue(deadline: IdleDeadline): boolean {
304
+ return deadline.timeRemaining() > 0;
340
305
  }
341
306
 
342
- const noOp = () => void 0
343
-
344
- class MicroTaskImpl extends BaseImpl implements RenderQueue {
345
- private _set: { (callback: VoidFunction): void; (callback: () => void): void } | typeof setTimeout
346
- private _clear:
347
- | { (id: number | undefined): void; (timeoutId: string | number | NodeJS.Timeout | undefined): void }
348
- | (() => undefined)
349
-
350
- constructor(
351
- readonly scope: Scope.Scope
352
- ) {
353
- super(scope)
354
-
355
- const [set, clear] = typeof globalThis.queueMicrotask === "function"
356
- ? [globalThis.queueMicrotask.bind(globalThis), noOp]
357
- : [setTimeout, clearTimeout]
358
- this._set = set
359
- this._clear = clear
360
- }
361
-
362
- run: Effect.Effect<void> = Effect.async((cb) => {
363
- const id = this._set(() => {
364
- this.runAllTasks()
365
- return cb(Effect.void)
366
- })
367
- return Effect.sync(() => {
368
- this.scheduled = false
369
- if (id) {
370
- this._clear(id)
371
- }
372
- })
373
- })
374
-
375
- private runAllTasks = () => {
376
- const iterator = this.queue.entries()
377
- while (this.runTasks(iterator)) {
378
- // Continue
307
+ type KeyedPriorityBucket<A> = [priority: number, Map<unknown, A>];
308
+
309
+ function insert<A>(
310
+ buckets: Array<KeyedPriorityBucket<A>>,
311
+ priority: number,
312
+ key: unknown,
313
+ task: A,
314
+ onRemoved: (task: A) => void,
315
+ ): void {
316
+ const index = binarySearch(buckets, priority);
317
+ if (index === buckets.length) {
318
+ buckets.push([priority, new Map([[key, task]])]);
319
+ } else {
320
+ const map = buckets[index][1];
321
+ const existing = map.get(key);
322
+ if (existing !== undefined) {
323
+ onRemoved(existing);
379
324
  }
380
-
381
- this.scheduled = false
325
+ map.set(key, task);
382
326
  }
383
327
  }
384
328
 
385
- class SyncImpl implements RenderQueue {
386
- constructor() {
387
- this.add.bind(this)
388
- }
389
-
390
- add(_: unknown, task: () => void) {
391
- return Effect.sync(task)
329
+ function remove<A>(buckets: Array<KeyedPriorityBucket<A>>, priority: number, key: unknown): void {
330
+ const index = binarySearch(buckets, priority);
331
+ if (index === buckets.length) {
332
+ return;
392
333
  }
334
+ buckets[index][1].delete(key);
393
335
  }
394
336
 
395
- class MixedImpl implements RenderQueue {
396
- private _priorityCache = new Map<number, RenderQueue>()
397
-
398
- constructor(
399
- readonly queues: Array<readonly [priorityRange: readonly [number, number], RenderQueue]>
400
- ) {
401
- this.queues.sort(([a], [b]) => a[0] - b[0])
402
-
403
- this.add.bind(this)
404
- }
405
-
406
- add(part: unknown, task: () => void, priority: number) {
407
- let queue = this.getQueueForPriority(priority)
408
-
409
- if (queue === undefined) {
410
- queue = this.queues[this.queues.length - 1][1]
411
- }
412
-
413
- return queue.add(part, task, priority)
414
- }
415
-
416
- private getQueueForPriority(priority: number) {
417
- if (this._priorityCache.has(priority)) {
418
- return this._priorityCache.get(priority)!
419
- }
420
-
421
- const q = this.queues.find(([range]) => priority >= range[0] && priority <= range[1])
422
-
423
- if (q) {
424
- this._priorityCache.set(priority, q[1])
425
- return q[1]
337
+ function binarySearch<A>(buckets: Array<KeyedPriorityBucket<A>>, priority: number): number {
338
+ let low = 0;
339
+ let high = buckets.length - 1;
340
+ while (low <= high) {
341
+ const mid = Math.floor((low + high) / 2);
342
+ const [bucketPriority] = buckets[mid];
343
+ if (bucketPriority === priority) {
344
+ return mid;
345
+ } else if (bucketPriority < priority) {
346
+ low = mid + 1;
347
+ } else {
348
+ high = mid - 1;
426
349
  }
427
-
428
- return q
429
350
  }
351
+ return low;
430
352
  }
431
-
432
- /**
433
- * @since 1.0.0
434
- */
435
- export const withCurrentPriority = <A, E, R>(f: (priority: number) => Effect.Effect<A, E, R>) =>
436
- Effect.flatMap(FiberRef.get(currentPriority), f)
437
-
438
- /**
439
- * @since 1.0.0
440
- */
441
- export const usingCurrentPriority: {
442
- (priority: number): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
443
- <A, E, R>(effect: Effect.Effect<A, E, R>, priority: number): Effect.Effect<A, E, R>
444
- } = dual(
445
- 2,
446
- <A, E, R>(effect: Effect.Effect<A, E, R>, priority: number) => Effect.locally(effect, currentPriority, priority)
447
- )