@typed/fx 0.0.6 → 0.0.8

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 (220) hide show
  1. package/.eslintcache +1 -1
  2. package/cjs/Env/Env.d.ts +9 -1
  3. package/cjs/Env/Env.d.ts.map +1 -1
  4. package/cjs/Env/Env.js +32 -5
  5. package/cjs/Env/Env.js.map +1 -1
  6. package/cjs/FiberContext/FiberContext.js +1 -1
  7. package/cjs/FiberContext/FiberContext.js.map +1 -1
  8. package/cjs/FiberRef/builtins.d.ts +4 -1
  9. package/cjs/FiberRef/builtins.d.ts.map +1 -1
  10. package/cjs/FiberRef/builtins.js +40 -13
  11. package/cjs/FiberRef/builtins.js.map +1 -1
  12. package/cjs/FiberRuntime/FiberRuntime.js +1 -1
  13. package/cjs/FiberRuntime/FiberRuntime.js.map +1 -1
  14. package/cjs/Fx/Fx.d.ts +1 -1
  15. package/cjs/Fx/Fx.d.ts.map +1 -1
  16. package/cjs/Fx/Fx.js +1 -2
  17. package/cjs/Fx/Fx.js.map +1 -1
  18. package/cjs/Stream/Stream.d.ts +0 -4
  19. package/cjs/Stream/Stream.d.ts.map +1 -1
  20. package/cjs/Stream/Stream.js.map +1 -1
  21. package/cjs/Stream/bimap.d.ts +29 -1
  22. package/cjs/Stream/bimap.d.ts.map +1 -1
  23. package/cjs/Stream/bimap.js +98 -3
  24. package/cjs/Stream/bimap.js.map +1 -1
  25. package/cjs/Stream/delay.d.ts +4 -0
  26. package/cjs/Stream/delay.d.ts.map +1 -0
  27. package/cjs/Stream/delay.js +30 -0
  28. package/cjs/Stream/delay.js.map +1 -0
  29. package/cjs/Stream/flatMap.d.ts.map +1 -1
  30. package/cjs/Stream/flatMap.js +10 -22
  31. package/cjs/Stream/flatMap.js.map +1 -1
  32. package/cjs/Stream/flatMapConcurrently.d.ts +1 -0
  33. package/cjs/Stream/flatMapConcurrently.d.ts.map +1 -1
  34. package/cjs/Stream/flatMapConcurrently.js +6 -1
  35. package/cjs/Stream/flatMapConcurrently.js.map +1 -1
  36. package/cjs/Stream/foldMap.d.ts +11 -0
  37. package/cjs/Stream/foldMap.d.ts.map +1 -0
  38. package/cjs/Stream/foldMap.js +67 -0
  39. package/cjs/Stream/foldMap.js.map +1 -0
  40. package/cjs/Stream/fromArray.d.ts +2 -0
  41. package/cjs/Stream/fromArray.d.ts.map +1 -0
  42. package/cjs/Stream/fromArray.js +12 -0
  43. package/cjs/Stream/fromArray.js.map +1 -0
  44. package/cjs/Stream/fromFx.d.ts +9 -0
  45. package/cjs/Stream/fromFx.d.ts.map +1 -1
  46. package/cjs/Stream/fromFx.js +14 -3
  47. package/cjs/Stream/fromFx.js.map +1 -1
  48. package/cjs/Stream/hkt.d.ts +24 -1
  49. package/cjs/Stream/hkt.d.ts.map +1 -1
  50. package/cjs/Stream/hkt.js +43 -5
  51. package/cjs/Stream/hkt.js.map +1 -1
  52. package/cjs/Stream/hold.d.ts.map +1 -1
  53. package/cjs/Stream/hold.js +2 -2
  54. package/cjs/Stream/hold.js.map +1 -1
  55. package/cjs/Stream/index.d.ts +6 -1
  56. package/cjs/Stream/index.d.ts.map +1 -1
  57. package/cjs/Stream/index.js +6 -1
  58. package/cjs/Stream/index.js.map +1 -1
  59. package/cjs/Stream/orElse.d.ts +1 -1
  60. package/cjs/Stream/orElse.d.ts.map +1 -1
  61. package/cjs/Stream/orElse.js +7 -20
  62. package/cjs/Stream/orElse.js.map +1 -1
  63. package/cjs/Stream/provide.d.ts +8 -0
  64. package/cjs/Stream/provide.d.ts.map +1 -0
  65. package/cjs/Stream/provide.js +42 -0
  66. package/cjs/Stream/provide.js.map +1 -0
  67. package/cjs/Stream/run.d.ts +2 -2
  68. package/cjs/Stream/run.d.ts.map +1 -1
  69. package/cjs/Stream/run.js +1 -1
  70. package/cjs/Stream/run.js.map +1 -1
  71. package/cjs/Stream/setFiberRefLocally.d.ts.map +1 -1
  72. package/cjs/Stream/setFiberRefLocally.js +6 -4
  73. package/cjs/Stream/setFiberRefLocally.js.map +1 -1
  74. package/cjs/Stream/skipRepeats.d.ts +5 -0
  75. package/cjs/Stream/skipRepeats.d.ts.map +1 -0
  76. package/cjs/Stream/skipRepeats.js +36 -0
  77. package/cjs/Stream/skipRepeats.js.map +1 -0
  78. package/cjs/Stream/switchMap.d.ts.map +1 -1
  79. package/cjs/Stream/switchMap.js +9 -21
  80. package/cjs/Stream/switchMap.js.map +1 -1
  81. package/cjs/Supervisor/index.d.ts +2 -0
  82. package/cjs/Supervisor/index.d.ts.map +1 -1
  83. package/cjs/Supervisor/index.js +2 -0
  84. package/cjs/Supervisor/index.js.map +1 -1
  85. package/cjs/Supervisor/inheritFiberRefs.d.ts +2 -0
  86. package/cjs/Supervisor/inheritFiberRefs.d.ts.map +1 -0
  87. package/cjs/Supervisor/inheritFiberRefs.js +17 -0
  88. package/cjs/Supervisor/inheritFiberRefs.js.map +1 -0
  89. package/esm/Env/Env.d.ts +9 -1
  90. package/esm/Env/Env.d.ts.map +1 -1
  91. package/esm/Env/Env.js +8 -5
  92. package/esm/Env/Env.js.map +1 -1
  93. package/esm/FiberContext/FiberContext.js +1 -1
  94. package/esm/FiberContext/FiberContext.js.map +1 -1
  95. package/esm/FiberRef/builtins.d.ts +4 -1
  96. package/esm/FiberRef/builtins.d.ts.map +1 -1
  97. package/esm/FiberRef/builtins.js +36 -12
  98. package/esm/FiberRef/builtins.js.map +1 -1
  99. package/esm/FiberRuntime/FiberRuntime.js +1 -1
  100. package/esm/FiberRuntime/FiberRuntime.js.map +1 -1
  101. package/esm/Fx/Fx.d.ts +1 -1
  102. package/esm/Fx/Fx.d.ts.map +1 -1
  103. package/esm/Fx/Fx.js +1 -2
  104. package/esm/Fx/Fx.js.map +1 -1
  105. package/esm/Stream/Stream.d.ts +0 -4
  106. package/esm/Stream/Stream.d.ts.map +1 -1
  107. package/esm/Stream/Stream.js.map +1 -1
  108. package/esm/Stream/bimap.d.ts +29 -1
  109. package/esm/Stream/bimap.d.ts.map +1 -1
  110. package/esm/Stream/bimap.js +91 -2
  111. package/esm/Stream/bimap.js.map +1 -1
  112. package/esm/Stream/delay.d.ts +4 -0
  113. package/esm/Stream/delay.d.ts.map +1 -0
  114. package/esm/Stream/delay.js +26 -0
  115. package/esm/Stream/delay.js.map +1 -0
  116. package/esm/Stream/flatMap.d.ts.map +1 -1
  117. package/esm/Stream/flatMap.js +9 -21
  118. package/esm/Stream/flatMap.js.map +1 -1
  119. package/esm/Stream/flatMapConcurrently.d.ts +1 -0
  120. package/esm/Stream/flatMapConcurrently.d.ts.map +1 -1
  121. package/esm/Stream/flatMapConcurrently.js +4 -0
  122. package/esm/Stream/flatMapConcurrently.js.map +1 -1
  123. package/esm/Stream/foldMap.d.ts +11 -0
  124. package/esm/Stream/foldMap.d.ts.map +1 -0
  125. package/esm/Stream/foldMap.js +38 -0
  126. package/esm/Stream/foldMap.js.map +1 -0
  127. package/esm/Stream/fromArray.d.ts +2 -0
  128. package/esm/Stream/fromArray.d.ts.map +1 -0
  129. package/esm/Stream/fromArray.js +8 -0
  130. package/esm/Stream/fromArray.js.map +1 -0
  131. package/esm/Stream/fromFx.d.ts +9 -0
  132. package/esm/Stream/fromFx.d.ts.map +1 -1
  133. package/esm/Stream/fromFx.js +12 -2
  134. package/esm/Stream/fromFx.js.map +1 -1
  135. package/esm/Stream/hkt.d.ts +24 -1
  136. package/esm/Stream/hkt.d.ts.map +1 -1
  137. package/esm/Stream/hkt.js +41 -4
  138. package/esm/Stream/hkt.js.map +1 -1
  139. package/esm/Stream/hold.d.ts.map +1 -1
  140. package/esm/Stream/hold.js +2 -2
  141. package/esm/Stream/hold.js.map +1 -1
  142. package/esm/Stream/index.d.ts +6 -1
  143. package/esm/Stream/index.d.ts.map +1 -1
  144. package/esm/Stream/index.js +6 -1
  145. package/esm/Stream/index.js.map +1 -1
  146. package/esm/Stream/orElse.d.ts +1 -1
  147. package/esm/Stream/orElse.d.ts.map +1 -1
  148. package/esm/Stream/orElse.js +8 -21
  149. package/esm/Stream/orElse.js.map +1 -1
  150. package/esm/Stream/provide.d.ts +8 -0
  151. package/esm/Stream/provide.d.ts.map +1 -0
  152. package/esm/Stream/provide.js +13 -0
  153. package/esm/Stream/provide.js.map +1 -0
  154. package/esm/Stream/run.d.ts +2 -2
  155. package/esm/Stream/run.d.ts.map +1 -1
  156. package/esm/Stream/run.js +2 -2
  157. package/esm/Stream/run.js.map +1 -1
  158. package/esm/Stream/setFiberRefLocally.d.ts.map +1 -1
  159. package/esm/Stream/setFiberRefLocally.js +6 -4
  160. package/esm/Stream/setFiberRefLocally.js.map +1 -1
  161. package/esm/Stream/skipRepeats.d.ts +5 -0
  162. package/esm/Stream/skipRepeats.d.ts.map +1 -0
  163. package/esm/Stream/skipRepeats.js +31 -0
  164. package/esm/Stream/skipRepeats.js.map +1 -0
  165. package/esm/Stream/switchMap.d.ts.map +1 -1
  166. package/esm/Stream/switchMap.js +8 -20
  167. package/esm/Stream/switchMap.js.map +1 -1
  168. package/esm/Supervisor/index.d.ts +2 -0
  169. package/esm/Supervisor/index.d.ts.map +1 -1
  170. package/esm/Supervisor/index.js +2 -0
  171. package/esm/Supervisor/index.js.map +1 -1
  172. package/esm/Supervisor/inheritFiberRefs.d.ts +2 -0
  173. package/esm/Supervisor/inheritFiberRefs.d.ts.map +1 -0
  174. package/esm/Supervisor/inheritFiberRefs.js +14 -0
  175. package/esm/Supervisor/inheritFiberRefs.js.map +1 -0
  176. package/package.json +68 -22
  177. package/perf/Stream-filter-map-reduce.test.ts +103 -0
  178. package/src/Env/Env.ts +15 -5
  179. package/src/FiberContext/FiberContext.ts +1 -1
  180. package/src/FiberRef/builtins.ts +45 -2
  181. package/src/FiberRuntime/FiberRuntime.ts +3 -3
  182. package/src/Fx/Fx.ts +1 -1
  183. package/src/Stream/Stream.ts +0 -4
  184. package/src/Stream/bimap.ts +148 -3
  185. package/src/Stream/delay.ts +43 -0
  186. package/src/Stream/flatMap.ts +3 -16
  187. package/src/Stream/flatMapConcurrently.ts +4 -0
  188. package/src/Stream/foldMap.ts +88 -0
  189. package/src/Stream/fromArray.ts +8 -0
  190. package/src/Stream/fromFx.ts +16 -7
  191. package/src/Stream/hkt.ts +59 -10
  192. package/src/Stream/hold.ts +2 -2
  193. package/src/Stream/index.ts +6 -1
  194. package/src/Stream/orElse.ts +7 -23
  195. package/src/Stream/provide.test.ts +78 -0
  196. package/src/Stream/provide.ts +34 -0
  197. package/src/Stream/run.ts +6 -3
  198. package/src/Stream/setFiberRefLocally.ts +10 -16
  199. package/src/Stream/skipRepeats.ts +41 -0
  200. package/src/Stream/switchMap.ts +3 -17
  201. package/src/Supervisor/index.ts +2 -0
  202. package/src/Supervisor/inheritFiberRefs.ts +17 -0
  203. package/cjs/Stream/map.d.ts +0 -15
  204. package/cjs/Stream/map.d.ts.map +0 -1
  205. package/cjs/Stream/map.js +0 -33
  206. package/cjs/Stream/map.js.map +0 -1
  207. package/cjs/test.d.ts +0 -1
  208. package/cjs/test.d.ts.map +0 -1
  209. package/cjs/test.js +0 -2
  210. package/cjs/test.js.map +0 -1
  211. package/esm/Stream/map.d.ts +0 -15
  212. package/esm/Stream/map.d.ts.map +0 -1
  213. package/esm/Stream/map.js +0 -28
  214. package/esm/Stream/map.js.map +0 -1
  215. package/esm/test.d.ts +0 -1
  216. package/esm/test.d.ts.map +0 -1
  217. package/esm/test.js +0 -2
  218. package/esm/test.js.map +0 -1
  219. package/src/Stream/map.ts +0 -49
  220. package/src/test.ts +0 -0
@@ -0,0 +1,14 @@
1
+ import { isRight } from 'hkt-ts/Either';
2
+ import { isJust } from 'hkt-ts/Maybe';
3
+ import { None } from './Supervisor.js';
4
+ import { join } from "../FiberRefs/FiberRefs.js";
5
+ export const inheritFiberRefs = None.extend({
6
+ onEnd: () => (fiber, exit) => {
7
+ const parentContext = fiber.context.parent;
8
+ // Merge FiberRefs upon successful completion
9
+ if (isRight(exit) && isJust(parentContext)) {
10
+ join(parentContext.value.fiberRefs, fiber.context.fiberRefs);
11
+ }
12
+ },
13
+ });
14
+ //# sourceMappingURL=inheritFiberRefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inheritFiberRefs.js","sourceRoot":"","sources":["../../src/Supervisor/inheritFiberRefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,kCAAgC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAA;QAE1C,6CAA6C;QAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;SAC7D;IACH,CAAC;CACF,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typed/fx",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "High-performance Asynchronous Effects",
5
5
  "type": "module",
6
6
  "main": "esm/index.js",
@@ -25,7 +25,7 @@
25
25
  "preversion": "npm test",
26
26
  "postversion": "npm run build && npm publish --access=public",
27
27
  "prepare": "ts-patch install -s",
28
- "example": "node --loader @esbuild-kit/esm-loader --experimental-specifier-resolution=node ./src/example.ts"
28
+ "perf:stream:filter-map-reduce": "node --loader @esbuild-kit/esm-loader perf/Stream-filter-map-reduce.test.ts"
29
29
  },
30
30
  "keywords": [
31
31
  "Fx",
@@ -51,12 +51,17 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@esbuild-kit/esm-loader": "^2.4.2",
54
+ "@most/core": "^1.6.1",
55
+ "@most/scheduler": "^1.3.0",
56
+ "@most/types": "^1.1.0",
57
+ "@types/benchmark": "^2.1.2",
54
58
  "@types/mocha": "^9.1.1",
55
59
  "@types/node": "^17.0.45",
56
60
  "@types/prettier": "^2.7.0",
57
61
  "@typescript-eslint/eslint-plugin": "^5.34.0",
58
62
  "@typescript-eslint/parser": "^5.34.0",
59
63
  "@zoltu/typescript-transformer-append-js-extension": "^1.0.1",
64
+ "benchmark": "^2.1.4",
60
65
  "c8": "^7.12.0",
61
66
  "concurrently": "^7.3.0",
62
67
  "eslint": "^8.22.0",
@@ -71,6 +76,7 @@
71
76
  "lint-staged": "^12.5.0",
72
77
  "mocha": "^10.0.0",
73
78
  "prettier": "^2.7.1",
79
+ "rxjs": "^7.5.6",
74
80
  "source-map-support": "^0.5.21",
75
81
  "ts-morph": "^15.1.0",
76
82
  "ts-node": "^10.9.1",
@@ -1196,6 +1202,16 @@
1196
1202
  "types": "./esm/Stream/continueWith.d.ts"
1197
1203
  }
1198
1204
  },
1205
+ "./Stream/delay": {
1206
+ "require": {
1207
+ "default": "./cjs/Stream/delay.js",
1208
+ "types": "./cjs/Stream/delay.d.ts"
1209
+ },
1210
+ "import": {
1211
+ "default": "./esm/Stream/delay.js",
1212
+ "types": "./esm/Stream/delay.d.ts"
1213
+ }
1214
+ },
1199
1215
  "./Stream/drain": {
1200
1216
  "require": {
1201
1217
  "default": "./cjs/Stream/drain.js",
@@ -1246,6 +1262,26 @@
1246
1262
  "types": "./esm/Stream/flatMapFx.d.ts"
1247
1263
  }
1248
1264
  },
1265
+ "./Stream/foldMap": {
1266
+ "require": {
1267
+ "default": "./cjs/Stream/foldMap.js",
1268
+ "types": "./cjs/Stream/foldMap.d.ts"
1269
+ },
1270
+ "import": {
1271
+ "default": "./esm/Stream/foldMap.js",
1272
+ "types": "./esm/Stream/foldMap.d.ts"
1273
+ }
1274
+ },
1275
+ "./Stream/fromArray": {
1276
+ "require": {
1277
+ "default": "./cjs/Stream/fromArray.js",
1278
+ "types": "./cjs/Stream/fromArray.d.ts"
1279
+ },
1280
+ "import": {
1281
+ "default": "./esm/Stream/fromArray.js",
1282
+ "types": "./esm/Stream/fromArray.d.ts"
1283
+ }
1284
+ },
1249
1285
  "./Stream/fromCallback": {
1250
1286
  "require": {
1251
1287
  "default": "./cjs/Stream/fromCallback.js",
@@ -1296,16 +1332,6 @@
1296
1332
  "types": "./esm/Stream/lazy.d.ts"
1297
1333
  }
1298
1334
  },
1299
- "./Stream/map": {
1300
- "require": {
1301
- "default": "./cjs/Stream/map.js",
1302
- "types": "./cjs/Stream/map.d.ts"
1303
- },
1304
- "import": {
1305
- "default": "./esm/Stream/map.js",
1306
- "types": "./esm/Stream/map.d.ts"
1307
- }
1308
- },
1309
1335
  "./Stream/merge": {
1310
1336
  "require": {
1311
1337
  "default": "./cjs/Stream/merge.js",
@@ -1346,6 +1372,16 @@
1346
1372
  "types": "./esm/Stream/periodic.d.ts"
1347
1373
  }
1348
1374
  },
1375
+ "./Stream/provide": {
1376
+ "require": {
1377
+ "default": "./cjs/Stream/provide.js",
1378
+ "types": "./cjs/Stream/provide.d.ts"
1379
+ },
1380
+ "import": {
1381
+ "default": "./esm/Stream/provide.js",
1382
+ "types": "./esm/Stream/provide.d.ts"
1383
+ }
1384
+ },
1349
1385
  "./Stream/run": {
1350
1386
  "require": {
1351
1387
  "default": "./cjs/Stream/run.js",
@@ -1386,6 +1422,16 @@
1386
1422
  "types": "./esm/Stream/setFiberRefLocally.d.ts"
1387
1423
  }
1388
1424
  },
1425
+ "./Stream/skipRepeats": {
1426
+ "require": {
1427
+ "default": "./cjs/Stream/skipRepeats.js",
1428
+ "types": "./cjs/Stream/skipRepeats.d.ts"
1429
+ },
1430
+ "import": {
1431
+ "default": "./esm/Stream/skipRepeats.js",
1432
+ "types": "./esm/Stream/skipRepeats.d.ts"
1433
+ }
1434
+ },
1389
1435
  "./Stream/switchMap": {
1390
1436
  "require": {
1391
1437
  "default": "./cjs/Stream/switchMap.js",
@@ -1426,6 +1472,16 @@
1426
1472
  "types": "./esm/Supervisor/Supervisor.d.ts"
1427
1473
  }
1428
1474
  },
1475
+ "./Supervisor/inheritFiberRefs": {
1476
+ "require": {
1477
+ "default": "./cjs/Supervisor/inheritFiberRefs.js",
1478
+ "types": "./cjs/Supervisor/inheritFiberRefs.d.ts"
1479
+ },
1480
+ "import": {
1481
+ "default": "./esm/Supervisor/inheritFiberRefs.js",
1482
+ "types": "./esm/Supervisor/inheritFiberRefs.d.ts"
1483
+ }
1484
+ },
1429
1485
  "./Supervisor/maxFailures": {
1430
1486
  "require": {
1431
1487
  "default": "./cjs/Supervisor/maxFailures.js",
@@ -1585,16 +1641,6 @@
1585
1641
  "default": "./esm/_internal/suite.js",
1586
1642
  "types": "./esm/_internal/suite.d.ts"
1587
1643
  }
1588
- },
1589
- "./test": {
1590
- "require": {
1591
- "default": "./cjs/test.js",
1592
- "types": "./cjs/test.d.ts"
1593
- },
1594
- "import": {
1595
- "default": "./esm/test.js",
1596
- "types": "./esm/test.d.ts"
1597
- }
1598
1644
  }
1599
1645
  }
1600
1646
  }
@@ -0,0 +1,103 @@
1
+ import * as M from '@most/core'
2
+ import * as MS from '@most/scheduler'
3
+ import benchmark from 'benchmark'
4
+ import { pipe } from 'hkt-ts'
5
+ import * as rxjs from 'rxjs'
6
+
7
+ import * as Stream from './index.js'
8
+
9
+ import * as Fx from '@/Fx/index.js'
10
+ import { RootScheduler } from '@/Scheduler/RootScheduler.js'
11
+ import { Scheduler } from '@/Scheduler/Scheduler.js'
12
+
13
+ const filterEvens = (x: number) => x % 2 === 0
14
+ const addOne = (x: number) => x + 1
15
+ const sum = (x: number, y: number) => x + y
16
+
17
+ const iterations = 1000000
18
+ const array = Array.from({ length: iterations }, (_, i) => i)
19
+
20
+ const fxStream = pipe(
21
+ Stream.fromArray(array),
22
+ Stream.filter(filterEvens),
23
+ Stream.map(addOne),
24
+ Stream.reduce(sum, 0),
25
+ Fx.provideService(Scheduler, RootScheduler()),
26
+ )
27
+
28
+ const mostStream = pipe(
29
+ M.periodic(0),
30
+ M.withItems(array),
31
+ M.filter(filterEvens),
32
+ M.map(addOne),
33
+ M.scan(sum, 0),
34
+ )
35
+
36
+ const mostScheduler = MS.newDefaultScheduler()
37
+
38
+ const rxjsStream = pipe(
39
+ rxjs.from(array),
40
+ rxjs.filter(filterEvens),
41
+ rxjs.map(addOne),
42
+ rxjs.scan(sum, 0),
43
+ )
44
+
45
+ // eslint-disable-next-line import/no-named-as-default-member
46
+ const suite = new benchmark.Suite('filter -> map -> reduce ' + iterations + ' integers')
47
+
48
+ suite
49
+ .add('@typed/fx', function (deferred: benchmark.Deferred) {
50
+ Fx.runMain(fxStream).then(() => deferred.resolve())
51
+ })
52
+ .add('@most/core', function (deferred: benchmark.Deferred) {
53
+ M.runEffects(mostStream, mostScheduler).then(() => deferred.resolve())
54
+ })
55
+ .add('rxjs @7', function (deferred: benchmark.Deferred) {
56
+ rxjsStream.subscribe({
57
+ complete: () => deferred.resolve(),
58
+ })
59
+ })
60
+ .on('start', logStart)
61
+ .on('cycle', logResults)
62
+ .on('complete', logComplete)
63
+ .run()
64
+
65
+ function logResults(e: any) {
66
+ const t = e.target
67
+
68
+ if (t.failure) {
69
+ console.error(padl(10, t.name) + 'FAILED: ' + e.target.failure)
70
+ } else {
71
+ const result =
72
+ padl(18, t.name) +
73
+ padr(13, t.hz.toFixed(2) + ' op/s') +
74
+ ' \xb1' +
75
+ padr(7, t.stats.rme.toFixed(2) + '%') +
76
+ padr(15, ' (' + t.stats.sample.length + ' samples)')
77
+
78
+ console.log(result)
79
+ }
80
+ }
81
+
82
+ function logStart(this: any) {
83
+ console.log(this.name)
84
+ console.log('-------------------------------------------------------')
85
+ }
86
+
87
+ function logComplete() {
88
+ console.log('-------------------------------------------------------')
89
+ }
90
+
91
+ function padl(n: number, s: string) {
92
+ while (s.length < n) {
93
+ s += ' '
94
+ }
95
+ return s
96
+ }
97
+
98
+ function padr(n: number, s: string) {
99
+ while (s.length < n) {
100
+ s = ' ' + s
101
+ }
102
+ return s
103
+ }
package/src/Env/Env.ts CHANGED
@@ -1,14 +1,24 @@
1
- import { getServiceFromFiberRefs } from '@/FiberRef/builtins.js'
1
+ import { makeEnvFromFiberRefs } from '@/FiberRef/builtins.js'
2
2
  import * as FiberRefs from '@/FiberRefs/FiberRefs.js'
3
3
  import { Of } from '@/Fx/Fx.js'
4
4
  import { Service } from '@/Service/Service.js'
5
5
 
6
+ /**
7
+ * Env is an abstraction over FiberRefs which keeps track of services and joining them back together.
8
+ */
6
9
  export interface Env<R> {
10
+ readonly fiberRefs: FiberRefs.FiberRefs
7
11
  readonly get: <S extends R>(service: Service<S>) => Of<S>
12
+ readonly addService: <S, I extends S>(service: Service<S>, impl: I) => Env<R | S>
13
+ readonly join: <S>(other: Env<S>) => Env<R | S>
8
14
  }
9
15
 
10
- export function Env<R>(fiberRefs: FiberRefs.FiberRefs): Env<R> {
11
- return {
12
- get: getServiceFromFiberRefs(fiberRefs.fork()),
13
- }
16
+ export const Empty = makeEnvFromFiberRefs<never>(FiberRefs.FiberRefs())
17
+
18
+ export function Env<S, I extends S>(service: Service<S>, impl: I): Env<S> {
19
+ return Empty.addService(service, impl)
20
+ }
21
+
22
+ export function fromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R> {
23
+ return makeEnvFromFiberRefs(fiberRefs)
14
24
  }
@@ -61,7 +61,7 @@ export function fork<Id extends FiberId.FiberId = FiberId.Live, Id2 extends Fibe
61
61
  platform: overrides?.platform ?? context.platform.fork(),
62
62
  fiberRefs: overrides?.fiberRefs ?? context.fiberRefs.fork(),
63
63
  scope: overrides?.scope ?? context.scope.fork(),
64
- supervisor: overrides?.supervisor ?? context.supervisor,
64
+ supervisor: overrides?.supervisor ?? None,
65
65
  logger: overrides?.logger ?? context.logger,
66
66
  parent: overrides?.parent ?? Just(context),
67
67
  })
@@ -19,8 +19,7 @@ import { Trace } from '@/Trace/Trace.js'
19
19
  export const CurrentEnv = make(
20
20
  pipe(
21
21
  Fx.getFiberContext,
22
- // Always use a snapshot of the FiberRefs to avoid mutability problems.
23
- Fx.map((c): Env<any> => ({ get: getServiceFromFiberRefs(c.fiberRefs.fork()) })),
22
+ Fx.map((c) => makeEnvFromFiberRefs(c.fiberRefs)),
24
23
  ),
25
24
  {
26
25
  fork: constant(Nothing), // Always create a new Env for each Fiber.
@@ -28,6 +27,18 @@ export const CurrentEnv = make(
28
27
  },
29
28
  )
30
29
 
30
+ export function makeEnvFromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R> {
31
+ // Always use a snapshot of the FiberRefs to avoid mutability problems.
32
+ const forked = FiberRefs.fork(fiberRefs)
33
+
34
+ return {
35
+ fiberRefs: forked,
36
+ get: getServiceFromFiberRefs(forked),
37
+ addService: addServiceFromFiberRefs(forked),
38
+ join: joinEnvFromFiberRefs(forked),
39
+ }
40
+ }
41
+
31
42
  export const CurrentConcurrencyLevel = make(
32
43
  Fx.fromLazy(() => new Semaphore(NonNegativeInteger(Infinity))),
33
44
  {
@@ -121,3 +132,35 @@ const getLayerFromFiberRefs = <S>(id: Service<S>, fiberRefs: FiberRefs.FiberRefs
121
132
 
122
133
  return join(fiber)
123
134
  })
135
+
136
+ export function addServiceFromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R>['addService'] {
137
+ return (id, impl) => {
138
+ const forked = fiberRefs.fork()
139
+
140
+ // AddService
141
+ FiberRefs.setFiberRef(
142
+ Services,
143
+ pipe(
144
+ forked,
145
+ FiberRefs.maybeGetFiberRefValue(Services),
146
+ Maybe.match(
147
+ () => ImmutableMap<Service<any>, any>().set(id, impl),
148
+ (s) => s.set(id, impl),
149
+ ),
150
+ ),
151
+ )(forked)
152
+
153
+ return makeEnvFromFiberRefs(forked)
154
+ }
155
+ }
156
+
157
+ export function joinEnvFromFiberRefs<R>(fiberRefs: FiberRefs.FiberRefs): Env<R>['join'] {
158
+ return (other) => {
159
+ const forked = other.fiberRefs.fork()
160
+
161
+ // Reverse the order to ensure incoming values take precedence for Services + Layers
162
+ FiberRefs.join(forked, fiberRefs)
163
+
164
+ return makeEnvFromFiberRefs(forked)
165
+ }
166
+ }
@@ -456,12 +456,12 @@ export class FiberRuntime<F extends Fx.AnyFx>
456
456
  protected processProvideService(
457
457
  instr: Extract<AnyInstruction, { readonly tag: 'ProvideService' }>,
458
458
  ) {
459
- this.withFiberRef(Builtin.Services, (services) =>
459
+ this.withFiberRef(Builtin.CurrentEnv, (env) =>
460
460
  pipe(
461
461
  instr.fx,
462
462
  Fx.fiberRefLocally(
463
- Builtin.Services,
464
- services.value.set(instr.service, instr.implementation),
463
+ Builtin.CurrentEnv,
464
+ env.value.addService(instr.service, instr.implementation),
465
465
  ),
466
466
  ),
467
467
  )
package/src/Fx/Fx.ts CHANGED
@@ -527,7 +527,7 @@ export const Top: T.Top3REC<FxHKT, never, never> = {
527
527
  top: now<unknown>([]),
528
528
  }
529
529
 
530
- export const top = T.top
530
+ export const top = Top.top
531
531
 
532
532
  export const never = async<never, never, never>(() => Either.Left(unit))
533
533
 
@@ -10,12 +10,10 @@ import { Sink } from '@/Sink/Sink.js'
10
10
  * - Loop
11
11
  * - zipItems
12
12
  * - withItems
13
- * - concatMap
14
13
  * - combine/combineArray
15
14
  * - zip/zipArray
16
15
  * - sample
17
16
  * - snapshot
18
- * - skipRepeats
19
17
  * - slice/take/skip
20
18
  * - takeWhile/skipWhile
21
19
  * - takeUntil/skipUntil
@@ -23,10 +21,8 @@ import { Sink } from '@/Sink/Sink.js'
23
21
  * - since
24
22
  * - during
25
23
  * - until
26
- * - delay
27
24
  * - throttle
28
25
  * - debounce
29
- * - reduce
30
26
  * - Fusion/Commutation
31
27
  * - Unique Identification for streams to add to tracing
32
28
  * - How to build a dynamic stream graph?
@@ -1,13 +1,14 @@
1
- import { flow } from 'hkt-ts/function'
1
+ import { Maybe } from 'hkt-ts'
2
+ import { flow, pipe } from 'hkt-ts/function'
2
3
 
3
4
  import { Stream } from './Stream.js'
4
- import { MapStream } from './map.js'
5
5
 
6
6
  import * as Cause from '@/Cause/index.js'
7
7
  import { FiberContext } from '@/FiberContext/FiberContext.js'
8
8
  import { Live } from '@/FiberId/FiberId.js'
9
+ import { unit } from '@/Fx/Fx.js'
9
10
  import { Scheduler } from '@/Scheduler/Scheduler.js'
10
- import { Sink } from '@/Sink/Sink.js'
11
+ import { Sink, addTrace } from '@/Sink/Sink.js'
11
12
 
12
13
  export function bimap<A, B, C, D>(
13
14
  f: (a: A) => B,
@@ -64,3 +65,147 @@ class BimapSink<A, B, C, D, E> implements Sink<A, C, E> {
64
65
  error = flow(Cause.map(this.f), this.sink.error)
65
66
  end = this.sink.end
66
67
  }
68
+
69
+ export function map<A, B>(
70
+ f: (a: A) => B,
71
+ __trace?: string,
72
+ ): <R, E>(stream: Stream<R, E, A>) => Stream<R, E, B> {
73
+ return (stream) => MapStream.make(stream, f, __trace)
74
+ }
75
+
76
+ export class MapStream<R, E, A, B> implements Stream<R, E, B> {
77
+ constructor(
78
+ readonly stream: Stream<R, E, A>,
79
+ readonly f: (a: A) => B,
80
+ readonly __trace?: string,
81
+ ) {}
82
+
83
+ fork<E2>(sink: Sink<E, B, E2>, scheduler: Scheduler, context: FiberContext<Live>) {
84
+ return this.stream.fork(
85
+ addTrace(
86
+ {
87
+ ...sink,
88
+ event: flow(this.f, sink.event),
89
+ },
90
+ this.__trace,
91
+ ),
92
+ scheduler,
93
+ context,
94
+ )
95
+ }
96
+
97
+ static make<R, E, A, B>(
98
+ stream: Stream<R, E, A>,
99
+ f: (a: A) => B,
100
+ __trace?: string,
101
+ ): Stream<R, E, B> {
102
+ if (stream instanceof MapStream) {
103
+ return MapStream.make(stream.stream, flow(stream.f, f), __trace)
104
+ }
105
+
106
+ if (stream instanceof MapLeftStream) {
107
+ return BimapStream.make(stream.stream, stream.f, f, __trace)
108
+ }
109
+
110
+ if (stream instanceof FilterMapStream) {
111
+ return FilterMapStream.make(stream.stream, flow(stream.f, Maybe.map(f)), __trace)
112
+ }
113
+
114
+ return new MapStream(stream, f, __trace)
115
+ }
116
+ }
117
+
118
+ export function mapLeft<E1, E2>(
119
+ f: (error: E1) => E2,
120
+ __trace?: string,
121
+ ): <R, A>(stream: Stream<R, E1, A>) => Stream<R, E2, A> {
122
+ return (stream) => MapLeftStream.make(stream, f, __trace)
123
+ }
124
+
125
+ export class MapLeftStream<R, E1, A, E2> implements Stream<R, E2, A> {
126
+ constructor(
127
+ readonly stream: Stream<R, E1, A>,
128
+ readonly f: (error: E1) => E2,
129
+ readonly __trace?: string,
130
+ ) {}
131
+
132
+ fork<E3>(sink: Sink<E2, A, E3>, scheduler: Scheduler, context: FiberContext<Live>) {
133
+ return this.stream.fork(
134
+ addTrace(
135
+ {
136
+ ...sink,
137
+ error: flow(Cause.map(this.f), sink.error),
138
+ },
139
+ this.__trace,
140
+ ),
141
+ scheduler,
142
+ context,
143
+ )
144
+ }
145
+
146
+ static make<R, E1, A, E2>(
147
+ stream: Stream<R, E1, A>,
148
+ f: (e: E1) => E2,
149
+ __trace?: string,
150
+ ): Stream<R, E2, A> {
151
+ if (stream instanceof MapLeftStream) {
152
+ return MapLeftStream.make(stream.stream, flow(stream.f, f), __trace)
153
+ }
154
+
155
+ if (stream instanceof MapStream) {
156
+ return BimapStream.make(stream.stream, f, stream.f, __trace)
157
+ }
158
+
159
+ return new MapLeftStream(stream, f, __trace)
160
+ }
161
+ }
162
+
163
+ export function filterMap<A, B>(
164
+ f: (a: A) => Maybe.Maybe<B>,
165
+ __trace?: string,
166
+ ): <R, E>(stream: Stream<R, E, A>) => Stream<R, E, B> {
167
+ return (stream) => FilterMapStream.make(stream, f, __trace)
168
+ }
169
+
170
+ export class FilterMapStream<R, E, A, B> implements Stream<R, E, B> {
171
+ constructor(
172
+ readonly stream: Stream<R, E, A>,
173
+ readonly f: (a: A) => Maybe.Maybe<B>,
174
+ readonly __trace?: string,
175
+ ) {}
176
+
177
+ fork<E2>(sink: Sink<E, B, E2>, scheduler: Scheduler, context: FiberContext<Live>) {
178
+ return this.stream.fork(
179
+ addTrace(
180
+ {
181
+ ...sink,
182
+ event: (a) =>
183
+ pipe(
184
+ a,
185
+ this.f,
186
+ Maybe.match(() => unit, sink.event),
187
+ ),
188
+ },
189
+ this.__trace,
190
+ ),
191
+ scheduler,
192
+ context,
193
+ )
194
+ }
195
+
196
+ static make<R, E, A, B>(
197
+ stream: Stream<R, E, A>,
198
+ f: (a: A) => Maybe.Maybe<B>,
199
+ __trace?: string,
200
+ ): Stream<R, E, B> {
201
+ if (stream instanceof MapStream) {
202
+ return FilterMapStream.make(stream.stream, flow(stream.f, f), __trace)
203
+ }
204
+
205
+ if (stream instanceof FilterMapStream) {
206
+ return FilterMapStream.make(stream.stream, flow(stream.f, Maybe.flatMap(f)), __trace)
207
+ }
208
+
209
+ return new FilterMapStream(stream, f, __trace)
210
+ }
211
+ }
@@ -0,0 +1,43 @@
1
+ import { Stream } from './Stream.js'
2
+
3
+ import { Env } from '@/Env/Env.js'
4
+ import { FiberContext } from '@/FiberContext/FiberContext.js'
5
+ import { FiberId } from '@/FiberId/FiberId.js'
6
+ import { access, fromLazy } from '@/Fx/index.js'
7
+ import { delayed } from '@/Schedule/Schedule.js'
8
+ import { Scheduler } from '@/Scheduler/Scheduler.js'
9
+ import { Sink } from '@/Sink/Sink.js'
10
+ import { Delay } from '@/Time/index.js'
11
+
12
+ export function delay(delay: Delay) {
13
+ return <R, E, A>(stream: Stream<R, E, A>): Stream<R, E, A> =>
14
+ Stream((sink, scheduler, context) =>
15
+ access((env: Env<R>) =>
16
+ stream.fork(new DelaySink(sink, scheduler, context, env, delay), scheduler, context),
17
+ ),
18
+ )
19
+ }
20
+
21
+ class DelaySink<E, A, E2> implements Sink<E, A, E2> {
22
+ constructor(
23
+ readonly sink: Sink<E, A, E2>,
24
+ readonly scheduler: Scheduler,
25
+ readonly context: FiberContext<FiberId.Live>,
26
+ readonly env: Env<any>,
27
+ readonly delay: Delay,
28
+ ) {}
29
+
30
+ event(value: A) {
31
+ return fromLazy(() =>
32
+ this.scheduler.schedule(
33
+ this.sink.event(value),
34
+ this.env,
35
+ delayed(this.delay),
36
+ this.context.fork(),
37
+ ),
38
+ )
39
+ }
40
+
41
+ error = this.sink.error
42
+ end = this.sink.end
43
+ }