@fncts/io 0.0.9 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. package/Channel/api.d.ts +27 -4
  2. package/Channel/internal/MergeDecision.d.ts +14 -0
  3. package/IO/runtime.d.ts +8 -1
  4. package/STM/api.d.ts +7 -0
  5. package/Sink/api.d.ts +637 -8
  6. package/TReentrantLock/api.d.ts +97 -0
  7. package/TReentrantLock/definition.d.ts +65 -0
  8. package/TReentrantLock.d.ts +2 -0
  9. package/_cjs/Cached/api.cjs +1 -1
  10. package/_cjs/Cached/api.cjs.map +1 -1
  11. package/_cjs/Channel/api/mapOutIOC.cjs +1 -1
  12. package/_cjs/Channel/api/mapOutIOC.cjs.map +1 -1
  13. package/_cjs/Channel/api/mergeAllWith.cjs +2 -2
  14. package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
  15. package/_cjs/Channel/api/mergeWith.cjs +1 -1
  16. package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
  17. package/_cjs/Channel/api.cjs +87 -32
  18. package/_cjs/Channel/api.cjs.map +1 -1
  19. package/_cjs/Channel/internal/MergeDecision.cjs +11 -2
  20. package/_cjs/Channel/internal/MergeDecision.cjs.map +1 -1
  21. package/_cjs/IO/api/foreachC.cjs +2 -2
  22. package/_cjs/IO/api/foreachC.cjs.map +1 -1
  23. package/_cjs/IO/runtime.cjs +18 -7
  24. package/_cjs/IO/runtime.cjs.map +1 -1
  25. package/_cjs/STM/api.cjs +15 -6
  26. package/_cjs/STM/api.cjs.map +1 -1
  27. package/_cjs/Sink/api.cjs +1475 -42
  28. package/_cjs/Sink/api.cjs.map +1 -1
  29. package/_cjs/Stream/api.cjs +29 -29
  30. package/_cjs/Stream/api.cjs.map +1 -1
  31. package/_cjs/TReentrantLock/api.cjs +297 -0
  32. package/_cjs/TReentrantLock/api.cjs.map +1 -0
  33. package/_cjs/TReentrantLock/definition.cjs +125 -0
  34. package/_cjs/TReentrantLock/definition.cjs.map +1 -0
  35. package/_cjs/TReentrantLock.cjs +32 -0
  36. package/_cjs/TReentrantLock.cjs.map +1 -0
  37. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs +38 -0
  38. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -0
  39. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +38 -0
  40. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs.map +1 -0
  41. package/_cjs/collection/immutable/Conc/filterIO.cjs +35 -0
  42. package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -0
  43. package/_cjs/collection/immutable/Conc.cjs +13 -0
  44. package/_cjs/collection/immutable/Conc.cjs.map +1 -1
  45. package/_cjs/demo.cjs +15 -0
  46. package/_cjs/demo.cjs.map +1 -0
  47. package/_mjs/Cached/api.mjs +1 -1
  48. package/_mjs/Cached/api.mjs.map +1 -1
  49. package/_mjs/Channel/api/mapOutIOC.mjs +1 -1
  50. package/_mjs/Channel/api/mapOutIOC.mjs.map +1 -1
  51. package/_mjs/Channel/api/mergeAllWith.mjs +2 -2
  52. package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
  53. package/_mjs/Channel/api/mergeWith.mjs +1 -1
  54. package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
  55. package/_mjs/Channel/api.mjs +75 -30
  56. package/_mjs/Channel/api.mjs.map +1 -1
  57. package/_mjs/Channel/internal/MergeDecision.mjs +7 -0
  58. package/_mjs/Channel/internal/MergeDecision.mjs.map +1 -1
  59. package/_mjs/IO/api/foreachC.mjs +2 -2
  60. package/_mjs/IO/api/foreachC.mjs.map +1 -1
  61. package/_mjs/IO/runtime.mjs +15 -5
  62. package/_mjs/IO/runtime.mjs.map +1 -1
  63. package/_mjs/STM/api.mjs +13 -6
  64. package/_mjs/STM/api.mjs.map +1 -1
  65. package/_mjs/Sink/api.mjs +1287 -37
  66. package/_mjs/Sink/api.mjs.map +1 -1
  67. package/_mjs/Stream/api.mjs +29 -29
  68. package/_mjs/Stream/api.mjs.map +1 -1
  69. package/_mjs/TReentrantLock/api.mjs +243 -0
  70. package/_mjs/TReentrantLock/api.mjs.map +1 -0
  71. package/_mjs/TReentrantLock/definition.mjs +102 -0
  72. package/_mjs/TReentrantLock/definition.mjs.map +1 -0
  73. package/_mjs/TReentrantLock.mjs +4 -0
  74. package/_mjs/TReentrantLock.mjs.map +1 -0
  75. package/_mjs/collection/immutable/Conc/dropUntilIO.mjs +26 -0
  76. package/_mjs/collection/immutable/Conc/dropUntilIO.mjs.map +1 -0
  77. package/_mjs/collection/immutable/Conc/dropWhileIO.mjs +26 -0
  78. package/_mjs/collection/immutable/Conc/dropWhileIO.mjs.map +1 -0
  79. package/_mjs/collection/immutable/Conc/filterIO.mjs +22 -0
  80. package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -0
  81. package/_mjs/collection/immutable/Conc.mjs +1 -0
  82. package/_mjs/collection/immutable/Conc.mjs.map +1 -1
  83. package/_mjs/demo.mjs +7 -0
  84. package/_mjs/demo.mjs.map +1 -0
  85. package/_src/Channel/api.ts +98 -11
  86. package/_src/Channel/internal/MergeDecision.ts +15 -0
  87. package/_src/IO/api.ts +1 -1
  88. package/_src/IO/runtime.ts +18 -11
  89. package/_src/STM/api.ts +9 -0
  90. package/_src/Sink/api.ts +1725 -36
  91. package/_src/TFuture/definition.ts +1 -1
  92. package/_src/TReentrantLock/api.ts +193 -0
  93. package/_src/TReentrantLock/definition.ts +86 -0
  94. package/_src/TReentrantLock.ts +4 -0
  95. package/_src/collection/immutable/Conc/dropUntilIO.ts +24 -0
  96. package/_src/collection/immutable/Conc/dropWhileIO.ts +26 -0
  97. package/_src/collection/immutable/Conc/filterIO.ts +16 -0
  98. package/_src/collection/immutable/Conc.ts +1 -0
  99. package/_src/demo.ts +6 -0
  100. package/collection/immutable/Conc/dropUntilIO.d.ts +7 -0
  101. package/collection/immutable/Conc/dropWhileIO.d.ts +7 -0
  102. package/collection/immutable/Conc/filterIO.d.ts +7 -0
  103. package/collection/immutable/Conc.d.ts +1 -0
  104. package/demo.d.ts +1 -0
  105. package/package.json +3 -3
@@ -0,0 +1,102 @@
1
+ import * as tsplus_module_1 from "@fncts/base/typeclass/Equatable/api";
2
+ import * as tsplus_module_2 from "@fncts/base/collection/immutable/HashMap/api";
3
+ import * as tsplus_module_3 from "@fncts/base/collection/Iterable/api";
4
+ import * as tsplus_module_4 from "@fncts/base/data/Maybe/api";
5
+ import * as tsplus_module_5 from "@fncts/base/data/FiberId/api";
6
+ /**
7
+ * A `TReentrantLock` is a reentrant read/write lock. Multiple readers may all
8
+ * concurrently acquire read locks. Only one writer is allowed to acquire a
9
+ * write lock at any given time. Read locks may be upgraded into write locks. A
10
+ * fiber that has a write lock may acquire other write locks or read locks.
11
+ *
12
+ * The two primary methods of this structure are `readLock`, which acquires a
13
+ * read lock in a scoped context, and `writeLock`, which acquires a write lock
14
+ * in a scoped context.
15
+ *
16
+ * Although located in the STM package, there is no need for locks within STM
17
+ * transactions. However, this lock can be quite useful in effectful code, to
18
+ * provide consistent read/write access to mutable state; and being in STM
19
+ * allows this structure to be composed into more complicated concurrent
20
+ * structures that are consumed from effectful code.
21
+ *
22
+ * @tsplus type fncts.io.TReentrantLock
23
+ * @tsplus companion fncts.io.TReentrantLockOps
24
+ */
25
+
26
+ export class TReentrantLock {
27
+ constructor(data) {
28
+ this.data = data;
29
+ }
30
+
31
+ }
32
+ /**
33
+ * @tsplus type fncts.io.TReentrantLock.WriteLock
34
+ * @tsplus companion fncts.io.TReentrantLock.WriteLockOps
35
+ */
36
+
37
+ export class WriteLock {
38
+ constructor(writeLocks, readLocks, fiberId) {
39
+ this.writeLocks = writeLocks;
40
+ this.readLocks = readLocks;
41
+ this.fiberId = fiberId;
42
+ this._tag = 0
43
+ /* LockTag.WriteLock */
44
+ ;
45
+ }
46
+
47
+ readLocksHeld(fiberId) {
48
+ return tsplus_module_1.strictEquals(this.fiberId, fiberId) ? this.readLocks : 0;
49
+ }
50
+
51
+ writeLocksHeld(fiberId) {
52
+ return tsplus_module_1.strictEquals(this.fiberId, fiberId) ? this.writeLocks : 0;
53
+ }
54
+
55
+ }
56
+ /**
57
+ * @tsplus type fncts.io.TReentrantLock.ReadLock
58
+ * @tsplus companion fncts.io.TReentrantLock.ReadLockOps
59
+ */
60
+
61
+ export class ReadLock {
62
+ constructor(readers) {
63
+ this.readers = readers;
64
+ this._tag = 1
65
+ /* LockTag.ReadLock */
66
+ ;
67
+ this.writeLocks = 0;
68
+ }
69
+
70
+ get readLocks() {
71
+ return tsplus_module_3.sum(tsplus_module_2.values(this.readers));
72
+ }
73
+
74
+ readLocksHeld(fiberId) {
75
+ return tsplus_module_4.getOrElse_(tsplus_module_2.get_(this.readers, fiberId), () => 0);
76
+ }
77
+
78
+ writeLocksHeld(_fiberId) {
79
+ return 0;
80
+ }
81
+
82
+ noOtherHolder(fiberId) {
83
+ return tsplus_module_2.isEmpty(this.readers) || this.readers.size === 1 && tsplus_module_2.has_(this.readers, fiberId);
84
+ }
85
+
86
+ adjust(fiberId, adjust) {
87
+ const total = this.readLocksHeld(fiberId);
88
+ const newTotal = total + adjust;
89
+
90
+ if (newTotal < 0) {
91
+ throw new Error(`Defect: Fiber ${tsplus_module_5.threadName(fiberId)} releasing read lock it does not hold`);
92
+ }
93
+
94
+ if (newTotal === 0) {
95
+ return new ReadLock(tsplus_module_2.remove_(this.readers, fiberId));
96
+ }
97
+
98
+ return new ReadLock(tsplus_module_2.set_(this.readers, fiberId, newTotal));
99
+ }
100
+
101
+ }
102
+ //# sourceMappingURL=definition.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.mjs","mappings":";;;;;AAAA;;;;;;;;;;;;;;;;;;;;AAmBA,OAAM,MAAOA,cAAP,CAAqB;EACzBC,YAAqBC,IAArB,EAA2C;IAAtB;EAA0B;;AADtB;AAgB3B;;;;;AAIA,OAAM,MAAOC,SAAP,CAAgB;EAEpBF,YAAqBG,UAArB,EAAkDC,SAAlD,EAA8EC,OAA9E,EAA8F;IAAzE;IAA6B;IAA4B;IADrE,YAAI;IAAA;IAAJ;EACyF;;EAClGC,aAAa,CAACD,OAAD,EAAiB;IAC5B,OAAOE,kCAAKF,OAAL,EAAgBA,OAAhB,IAA0B,KAAKD,SAA/B,GAA2C,CAAlD;EACD;;EACDI,cAAc,CAACH,OAAD,EAAiB;IAC7B,OAAOE,kCAAKF,OAAL,EAAgBA,OAAhB,IAA0B,KAAKF,UAA/B,GAA4C,CAAnD;EACD;;AARmB;AAWtB;;;;;AAIA,OAAM,MAAOM,QAAP,CAAe;EAEnBT,YAAqBU,OAArB,EAAsD;IAAjC;IADZ,YAAI;IAAA;IAAJ;IAKT,kBAAa,CAAb;EAJ0D;;EAC7C,IAATN,SAAS;IACX,2BAAQO,4BAAKD,OAAL,CAAR;EACD;;EAGDJ,aAAa,CAACD,OAAD,EAAiB;IAC5B,OAAOO,qDAAKF,OAAL,EAAiBL,OAAjB,GAAyB,MAAW,CAApC,CAAP;EACD;;EACDG,cAAc,CAACK,QAAD,EAAkB;IAC9B,OAAO,CAAP;EACD;;EAEDC,aAAa,CAACT,OAAD,EAAiB;IAC5B,OAAOM,6BAAKD,OAAL,KAAyB,KAAKA,OAAL,CAAaK,IAAb,KAAsB,CAAtB,IAA2BJ,0BAAKD,OAAL,EAAiBL,OAAjB,CAA3D;EACD;;EACDW,MAAM,CAACX,OAAD,EAAmBW,MAAnB,EAAiC;IACrC,MAAMC,KAAK,GAAM,KAAKX,aAAL,CAAmBD,OAAnB,CAAjB;IACA,MAAMa,QAAQ,GAAGD,KAAK,GAAGD,MAAzB;;IACA,IAAIE,QAAQ,GAAG,CAAf,EAAkB;MAChB,MAAM,IAAIC,KAAJ,CAAU,iBAAiBC,mCAAkB,uCAA7C,CAAN;IACD;;IACD,IAAIF,QAAQ,KAAK,CAAjB,EAAoB;MAClB,OAAO,IAAIT,QAAJ,CAAaE,6BAAKD,OAAL,EAAoBL,OAApB,CAAb,CAAP;IACD;;IACD,OAAO,IAAII,QAAJ,CAAaE,0BAAKD,OAAL,EAAiBL,OAAjB,EAA0Ba,QAA1B,CAAb,CAAP;EACD;;AA5BkB","names":["TReentrantLock","constructor","data","WriteLock","writeLocks","readLocks","fiberId","readLocksHeld","tsplus_module_1","writeLocksHeld","ReadLock","readers","tsplus_module_2","tsplus_module_4","_fiberId","noOtherHolder","size","adjust","total","newTotal","Error","tsplus_module_5"],"sourceRoot":"","sources":["../../_src/TReentrantLock/definition.ts"],"sourcesContent":[null]}
@@ -0,0 +1,4 @@
1
+ // codegen:start { preset: barrel, include: TReentrantLock/*.ts }
2
+ export * from "./TReentrantLock/api.mjs";
3
+ export * from "./TReentrantLock/definition.mjs";
4
+ //# sourceMappingURL=TReentrantLock.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TReentrantLock.mjs","mappings":"AAAA;AACA,cAAc,0BAAd;AACA,cAAc,iCAAd","names":[],"sourceRoot":"","sources":["../_src/TReentrantLock.ts"],"sourcesContent":[null]}
@@ -0,0 +1,26 @@
1
+ import * as tsplus_module_1 from "@fncts/base/collection/immutable/Conc";
2
+ import * as tsplus_module_2 from "@fncts/io/IO/api";
3
+ /**
4
+ * @tsplus fluent fncts.Conc dropUntilIO
5
+ */
6
+
7
+ export function dropUntilIO(self, p, __tsplusTrace) {
8
+ return tsplus_module_2.defer(() => {
9
+ const builder = new tsplus_module_1.ConcBuilder();
10
+ let dropping = tsplus_module_2.succeedNow(false, __tsplusTrace);
11
+
12
+ for (const elem of self) {
13
+ dropping = tsplus_module_2.flatMap_(dropping, b => {
14
+ if (b) {
15
+ builder.append(elem);
16
+ return tsplus_module_2.succeedNow(true, __tsplusTrace);
17
+ } else {
18
+ return p(elem);
19
+ }
20
+ }, __tsplusTrace);
21
+ }
22
+
23
+ return tsplus_module_2.as_(dropping, () => builder.result());
24
+ }, __tsplusTrace);
25
+ }
26
+ //# sourceMappingURL=dropUntilIO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropUntilIO.mjs","mappings":";;AAAA;;;;AAGA,OAAM,SAAUA,WAAV,CACJC,IADI,EAEJC,CAFI,EAGJC,aAHI,EAGkB;EAEtB,OAAOC,sBAAS,MAAK;IACnB,MAAMC,OAAO,GAAqB,oBAAIC,WAAJ,EAAlC;IACA,IAAIC,QAAQ,GAAsBH,2BAAc,KAAd,EAJpCD,aAIoC,CAAlC;;IACA,KAAK,MAAMK,IAAX,IAAmBP,IAAnB,EAAyB;MACvBM,QAAQ,GAAGH,mCAAkBK,CAAD,IAAM;QAChC,IAAIA,CAAJ,EAAO;UACLJ,OAAO,CAACK,MAAR,CAAeF,IAAf;UACA,OAAOJ,2BAAc,IAAd,EATfD,aASe,CAAP;QACD,CAHD,MAGO;UACL,OAAOD,CAAC,CAACM,IAAD,CAAR;QACD;MACF,CAPU,EANfL,aAMe,CAAX;IAQD;;IACD,OAAOC,8BAAQ,MAAIC,OAAO,CAACM,MAAR,EAAZ,CAAP;EACD,CAdM,EAFPR,aAEO,CAAP;AAeD","names":["dropUntilIO","self","p","__tsplusTrace","tsplus_module_2","builder","ConcBuilder","dropping","elem","b","append","result"],"sourceRoot":"","sources":["../../../../_src/collection/immutable/Conc/dropUntilIO.ts"],"sourcesContent":[null]}
@@ -0,0 +1,26 @@
1
+ import * as tsplus_module_1 from "@fncts/base/collection/immutable/Conc";
2
+ import * as tsplus_module_2 from "@fncts/io/IO/api";
3
+ /**
4
+ * @tsplus fluent fncts.Conc dropWhileIO
5
+ */
6
+
7
+ export function dropWhileIO(self, p, __tsplusTrace) {
8
+ return tsplus_module_2.defer(() => {
9
+ const builder = new tsplus_module_1.ConcBuilder();
10
+ let dropping = tsplus_module_2.succeedNow(true, __tsplusTrace);
11
+
12
+ for (const elem of self) {
13
+ dropping = tsplus_module_2.flatMap_(dropping, d => tsplus_module_2.map_(d ? p(elem) : tsplus_module_2.succeedNow(false, __tsplusTrace), b => {
14
+ if (b) {
15
+ return true;
16
+ } else {
17
+ builder.append(elem);
18
+ return false;
19
+ }
20
+ }, __tsplusTrace), __tsplusTrace);
21
+ }
22
+
23
+ return tsplus_module_2.as_(dropping, () => builder.result());
24
+ }, __tsplusTrace);
25
+ }
26
+ //# sourceMappingURL=dropWhileIO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropWhileIO.mjs","mappings":";;AAAA;;;;AAGA,OAAM,SAAUA,WAAV,CACJC,IADI,EAEJC,CAFI,EAGJC,aAHI,EAGkB;EAEtB,OAAOC,sBAAS,MAAK;IACnB,MAAMC,OAAO,GAAqB,oBAAIC,WAAJ,EAAlC;IACA,IAAIC,QAAQ,GAAsBH,2BAAc,IAAd,EAJpCD,aAIoC,CAAlC;;IACA,KAAK,MAAMK,IAAX,IAAmBP,IAAnB,EAAyB;MACvBM,QAAQ,GAAGH,mCAAkBK,CAAD,IAC1BL,qBAACK,CAAC,GAAGP,CAAC,CAACM,IAAD,CAAJ,GAAaJ,2BAAc,KAAd,EAPrBD,aAOqB,CAAf,EAA0CO,CAAD,IAAM;QAC7C,IAAIA,CAAJ,EAAO;UACL,OAAO,IAAP;QACD,CAFD,MAEO;UACLL,OAAO,CAACM,MAAR,CAAeH,IAAf;UACA,OAAO,KAAP;QACD;MACF,CAPD,EAPNL,aAOM,CADS,EANfA,aAMe,CAAX;IAUD;;IACD,OAAOC,8BAAQ,MAAIC,OAAO,CAACO,MAAR,EAAZ,CAAP;EACD,CAhBM,EAFPT,aAEO,CAAP;AAiBD","names":["dropWhileIO","self","p","__tsplusTrace","tsplus_module_2","builder","ConcBuilder","dropping","elem","d","b","append","result"],"sourceRoot":"","sources":["../../../../_src/collection/immutable/Conc/dropWhileIO.ts"],"sourcesContent":[null]}
@@ -0,0 +1,22 @@
1
+ const fileName_1 = "(@fncts/io) src/collection/immutable/Conc/filterIO.ts";
2
+ import * as tsplus_module_1 from "@fncts/base/collection/immutable/Conc";
3
+ import * as tsplus_module_2 from "@fncts/io/IO/api";
4
+ /**
5
+ * @tsplus fluent fncts.Conc filterIO
6
+ */
7
+
8
+ export function filterIO(self, p) {
9
+ return tsplus_module_2.defer(() => {
10
+ const builder = new tsplus_module_1.ConcBuilder();
11
+ let dest = tsplus_module_2.succeedNow(builder, fileName_1 + ":7:55");
12
+
13
+ for (const a of self) {
14
+ dest = tsplus_module_2.zipWith_(dest, p(a), (builder, res) => {
15
+ if (res) return builder.append(a);else return builder;
16
+ });
17
+ }
18
+
19
+ return tsplus_module_2.map_(dest, builder => builder.result(), fileName_1 + ":14:20");
20
+ }, fileName_1 + ":5:18");
21
+ }
22
+ //# sourceMappingURL=filterIO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterIO.mjs","mappings":";;;AAAA;;;;AAGA,OAAM,SAAUA,QAAV,CAA4BC,IAA5B,EAA2CC,CAA3C,EAAyE;EAC7E,OAAOC,sBAAS,MAAK;IACnB,MAAMC,OAAO,GAAG,oBAAIC,WAAJ,EAAhB;IACA,IAAIC,IAAI,GAA6BH,2BAAcC,OAAd,EAAqBG,oBAArB,CAArC;;IACA,KAAK,MAAMC,CAAX,IAAgBP,IAAhB,EAAsB;MACpBK,IAAI,GAAGH,+BAAaD,CAAC,CAACM,CAAD,CAAd,EAAmB,CAACJ,OAAD,EAAUK,GAAV,KAAiB;QACzC,IAAIA,GAAJ,EAAS,OAAOL,OAAO,CAACM,MAAR,CAAeF,CAAf,CAAP,CAAT,KACK,OAAOJ,OAAP;MACN,CAHM,CAAP;IAID;;IACD,OAAOD,2BAAUC,OAAD,IAAaA,OAAO,CAACO,MAAR,EAAtB,EAAsCJ,qBAAtC,CAAP;EACD,CAVM,EAUNA,oBAVM,CAAP;AAWD","names":["filterIO","self","p","tsplus_module_2","builder","ConcBuilder","dest","fileName_1","a","res","append","result"],"sourceRoot":"","sources":["../../../../_src/collection/immutable/Conc/filterIO.ts"],"sourcesContent":[null]}
@@ -1,4 +1,5 @@
1
1
  // codegen:start { preset: barrel, include: ./Conc/*.ts }
2
+ export * from "./Conc/filterIO.mjs";
2
3
  export * from "./Conc/findIO.mjs";
3
4
  export * from "./Conc/mapIO.mjs";
4
5
  export * from "./Conc/takeWhileIO.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"Conc.mjs","mappings":"AAAA;AACA,cAAc,mBAAd;AACA,cAAc,kBAAd;AACA,cAAc,wBAAd","names":[],"sourceRoot":"","sources":["../../../_src/collection/immutable/Conc.ts"],"sourcesContent":[null]}
1
+ {"version":3,"file":"Conc.mjs","mappings":"AAAA;AACA,cAAc,qBAAd;AACA,cAAc,mBAAd;AACA,cAAc,kBAAd;AACA,cAAc,wBAAd","names":[],"sourceRoot":"","sources":["../../../_src/collection/immutable/Conc.ts"],"sourcesContent":[null]}
package/_mjs/demo.mjs ADDED
@@ -0,0 +1,7 @@
1
+ const fileName_1 = "(@fncts/io) src/demo.ts";
2
+ import * as tsplus_module_1 from "@fncts/io/IO/api";
3
+ import * as tsplus_module_2 from "@fncts/io/IO/runtime";
4
+ tsplus_module_2.unsafeRunWith(tsplus_module_1.catchAllCause_(tsplus_module_1.flatMap_(tsplus_module_1.succeed(() => console.log(1), fileName_1 + ":1:11"), () => tsplus_module_1.halt(() => "lmao", fileName_1 + ":2:25"), fileName_1 + ":2:11"), cause => tsplus_module_1.succeed(() => console.log("failed"), fileName_1 + ":3:31"), fileName_1 + ":3:17"), exit => {
5
+ console.log(exit);
6
+ }, fileName_1 + ":4:17");
7
+ //# sourceMappingURL=demo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.mjs","mappings":";;;AAAAA,oHAAWC,OAAO,CAACC,GAAR,CAAY,CAAZ,CAAX,EAAyBC,oBAAzB,GACW,MAAMC,2BAAQ,MAAR,EAAcD,oBAAd,CADjB,EACgCA,oBADhC,GAEkBE,KAAD,IAAWD,8BAAGH,OAAO,CAACC,GAAR,CAAY,QAAZ,CAAH,EAAwBC,oBAAxB,CAF5B,EAEqDA,oBAFrD,GAGkBG,IAAD,IAAS;EACtBL,OAAO,CAACC,GAAR,CAAYI,IAAZ;AACD,CALH,EAKGH,oBALH","names":["tsplus_module_2","console","log","fileName_1","tsplus_module_1","cause","exit"],"sourceRoot":"","sources":["../_src/demo.ts"],"sourcesContent":[null]}
@@ -231,6 +231,23 @@ export function catchAllCause_<
231
231
  >(self, new ContinuationK((_) => Channel.endNow(_), f));
232
232
  }
233
233
 
234
+ /**
235
+ * @tsplus getter fncts.io.Channel collectElements
236
+ */
237
+ export function collectElements<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>(
238
+ self: Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>,
239
+ ): Channel<Env, InErr, InElem, InDone, OutErr, never, readonly [Conc<OutElem>, OutDone]> {
240
+ return Channel.defer(() => {
241
+ const builder = new ConcBuilder<OutElem>(Conc.empty());
242
+ const reader: Channel<Env, OutErr, OutElem, OutDone, OutErr, never, OutDone> = Channel.readWith(
243
+ (out) => Channel.succeed(builder.append(out)) > reader,
244
+ Channel.failNow,
245
+ Channel.succeedNow,
246
+ );
247
+ return self.pipeTo(reader).flatMap((z) => Channel.succeedNow([builder.result(), z]));
248
+ });
249
+ }
250
+
234
251
  /**
235
252
  * @tsplus getter fncts.io.Channel concatAll
236
253
  */
@@ -735,9 +752,9 @@ export function fromQueue<Err, Elem, Done>(
735
752
  */
736
753
  export function provideEnvironment_<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>(
737
754
  self: Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>,
738
- env: Environment<Env>,
755
+ env: Lazy<Environment<Env>>,
739
756
  ): Channel<unknown, InErr, InElem, InDone, OutErr, OutElem, OutDone> {
740
- return new Provide(env, self);
757
+ return Channel.defer(new Provide(env(), self));
741
758
  }
742
759
 
743
760
  /**
@@ -945,6 +962,49 @@ export function matchCauseChannel_<
945
962
  );
946
963
  }
947
964
 
965
+ /**
966
+ * Fold the channel exposing success and full error cause
967
+ *
968
+ * @tsplus fluent fncts.io.Channel matchChannel
969
+ */
970
+ export function matchChannel_<
971
+ Env,
972
+ Env1,
973
+ Env2,
974
+ InErr,
975
+ InErr1,
976
+ InErr2,
977
+ InElem,
978
+ InElem1,
979
+ InElem2,
980
+ InDone,
981
+ InDone1,
982
+ InDone2,
983
+ OutErr,
984
+ OutErr2,
985
+ OutErr3,
986
+ OutElem,
987
+ OutElem1,
988
+ OutElem2,
989
+ OutDone,
990
+ OutDone2,
991
+ OutDone3,
992
+ >(
993
+ channel: Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>,
994
+ onError: (e: OutErr) => Channel<Env1, InErr1, InElem1, InDone1, OutErr2, OutElem1, OutDone2>,
995
+ onSuccess: (o: OutDone) => Channel<Env2, InErr2, InElem2, InDone2, OutErr3, OutElem2, OutDone3>,
996
+ ): Channel<
997
+ Env & Env1 & Env2,
998
+ InErr & InErr1 & InErr2,
999
+ InElem & InElem1 & InElem2,
1000
+ InDone & InDone1 & InDone2,
1001
+ OutErr2 | OutErr3,
1002
+ OutElem | OutElem1 | OutElem2,
1003
+ OutDone2 | OutDone3
1004
+ > {
1005
+ return channel.matchCauseChannel((cause) => cause.failureOrCause.match(onError, Channel.failCauseNow), onSuccess);
1006
+ }
1007
+
948
1008
  export const never: Channel<unknown, unknown, unknown, unknown, never, never, never> = Channel.fromIO(IO.never);
949
1009
 
950
1010
  /**
@@ -1007,6 +1067,7 @@ export function orHaltWith_<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone
1007
1067
  * Pipe the output of a channel into the input of another
1008
1068
  *
1009
1069
  * @tsplus fluent fncts.io.Channel pipeTo
1070
+ * @tsplus operator fncts.io.Channel >>>
1010
1071
  */
1011
1072
  export function pipeTo_<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone, Env1, OutErr1, OutElem1, OutDone1>(
1012
1073
  left: Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>,
@@ -1174,16 +1235,24 @@ export function repeated<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>(
1174
1235
  }
1175
1236
 
1176
1237
  /**
1177
- * @tsplus static fncts.io.Channel toQueue
1238
+ * @tsplus static fncts.io.ChannelOps toQueue
1178
1239
  */
1179
1240
  export function toQueue<Err, Done, Elem>(
1180
- queue: Queue.Enqueue<Either<Exit<Err, Done>, Elem>>,
1181
- ): Channel<unknown, Err, Elem, Done, never, never, any> {
1182
- return readWithCause(
1183
- (in_: Elem) => Channel.fromIO(queue.offer(Either.right(in_))).apSecond(toQueue(queue)),
1184
- (cause: Cause<Err>) => Channel.fromIO(queue.offer(Either.left(Exit.failCause(cause)))),
1185
- (done: Done) => Channel.fromIO(queue.offer(Either.left(Exit.succeed(done)))),
1186
- );
1241
+ queue: Lazy<Queue.Enqueue<Either<Exit<Err, Done>, Elem>>>,
1242
+ ): Channel<unknown, Err, Elem, Done, never, never, unknown> {
1243
+ return Channel.defer(() => {
1244
+ function toQueue<Err, Done, Elem>(
1245
+ queue: Queue.Enqueue<Either<Exit<Err, Done>, Elem>>,
1246
+ ): Channel<unknown, Err, Elem, Done, never, never, unknown> {
1247
+ return Channel.readWithCause(
1248
+ (inp) => Channel.fromIO(queue.offer(Either.right(inp))) > toQueue(queue),
1249
+ (cause) => Channel.fromIO(queue.offer(Either.left(Exit.failCause(cause)))),
1250
+ (done) => Channel.fromIO(queue.offer(Either.left(Exit.succeed(done)))),
1251
+ );
1252
+ }
1253
+
1254
+ return toQueue(queue());
1255
+ });
1187
1256
  }
1188
1257
 
1189
1258
  /**
@@ -1249,10 +1318,28 @@ export function unwrap<R, E, Env, InErr, InElem, InDone, OutErr, OutElem, OutDon
1249
1318
  * @tsplus static fncts.io.ChannelOps unwrapScoped
1250
1319
  */
1251
1320
  export function unwrapScoped<R, E, Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>(
1252
- self: IO<R & Has<Scope>, E, Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>>,
1321
+ self: Lazy<IO<R & Has<Scope>, E, Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>>>,
1253
1322
  ): Channel<R & Env, InErr, InElem, InDone, E | OutErr, OutElem, OutDone> {
1254
1323
  return Channel.scoped(self).concatAllWith(
1255
1324
  (d, _) => d,
1256
1325
  (d, _) => d,
1257
1326
  );
1258
1327
  }
1328
+
1329
+ /**
1330
+ * @tsplus static fncts.io.ChannelOps fromHubScoped
1331
+ */
1332
+ export function fromHubScoped<Err, Done, Elem>(
1333
+ hub: Lazy<Hub<Either<Exit<Err, Done>, Elem>>>,
1334
+ ): IO<Has<Scope>, never, Channel<unknown, unknown, unknown, unknown, Err, Elem, Done>> {
1335
+ return IO.defer(hub().subscribe.map(Channel.fromQueue));
1336
+ }
1337
+
1338
+ /**
1339
+ * @tsplus static fncts.io.ChannelOps toHub
1340
+ */
1341
+ export function toHub<Err, Done, Elem>(
1342
+ hub: Lazy<Hub<Either<Exit<Err, Done>, Elem>>>,
1343
+ ): Channel<unknown, Err, Elem, Done, never, never, unknown> {
1344
+ return Channel.toQueue(hub);
1345
+ }
@@ -19,6 +19,21 @@ export abstract class MergeDecision<R, E0, Z0, E, Z> {
19
19
  readonly _Z!: () => Z;
20
20
  }
21
21
 
22
+ /**
23
+ * @tsplus unify fncts.io.Channel.MergeDecision
24
+ */
25
+ export function unifyMergeDecision<X extends MergeDecision<any, any, any, any, any>>(
26
+ _: X,
27
+ ): MergeDecision<
28
+ [X] extends [MergeDecision<infer R, any, any, any, any>] ? R : never,
29
+ [X] extends [MergeDecision<any, infer E0, any, any, any>] ? E0 : never,
30
+ [X] extends [MergeDecision<any, any, infer Z0, any, any>] ? Z0 : never,
31
+ [X] extends [MergeDecision<any, any, any, infer E, any>] ? E : never,
32
+ [X] extends [MergeDecision<any, any, any, any, infer Z>] ? Z : never
33
+ > {
34
+ return _;
35
+ }
36
+
22
37
  /**
23
38
  * @tsplus fluent fncts.io.Channel.MergeDecision concrete
24
39
  * @tsplus macro remove
package/_src/IO/api.ts CHANGED
@@ -99,7 +99,7 @@ export function asyncInterrupt<R, E, A>(
99
99
  * @tsplus fluent fncts.io.IO absorbWith
100
100
  */
101
101
  export function absorbWith_<R, E, A>(ma: IO<R, E, A>, f: (e: E) => unknown, __tsplusTrace?: string) {
102
- return ma.sandbox.matchIO((cause) => IO.failNow(cause.squashWith(f)), IO.succeedNow)
102
+ return ma.sandbox.matchIO((cause) => IO.failNow(cause.squashWith(f)), IO.succeedNow);
103
103
  }
104
104
 
105
105
  /**
@@ -7,18 +7,11 @@ import { IOEnv } from "@fncts/io/IOEnv/definition";
7
7
  export class Runtime<R> {
8
8
  constructor(readonly environment: Environment<R>, readonly runtimeConfig: RuntimeConfig) {}
9
9
 
10
- unsafeRunWith = <E, A>(
11
- io: IO<R, E, A>,
12
- k: (exit: Exit<E, A>) => any,
13
- __tsplusTrace?: string,
14
- ): ((fiberId: FiberId) => (f: (exit: Exit<E, A>) => any) => void) => {
15
- const fiberId = FiberId.unsafeMake(TraceElement.parse(__tsplusTrace));
16
-
17
- const children = new Set<FiberContext<any, any>>();
18
-
10
+ unsafeRunFiber = <E, A>(io: IO<R, E, A>, __tsplusTrace?: string): FiberContext<E, A> => {
11
+ const fiberId = FiberId.unsafeMake(TraceElement.parse(__tsplusTrace));
12
+ const children = new Set<FiberContext<any, any>>();
19
13
  const supervisor = this.runtimeConfig.supervisor;
20
-
21
- const context = new FiberContext<E, A>(
14
+ const context = new FiberContext<E, A>(
22
15
  fiberId,
23
16
  this.runtimeConfig,
24
17
  Stack.single(InterruptStatus.interruptible.toBoolean),
@@ -41,6 +34,15 @@ export class Runtime<R> {
41
34
 
42
35
  context.nextIO = concrete(io);
43
36
  context.run();
37
+ return context;
38
+ };
39
+
40
+ unsafeRunWith = <E, A>(
41
+ io: IO<R, E, A>,
42
+ k: (exit: Exit<E, A>) => any,
43
+ __tsplusTrace?: string,
44
+ ): ((fiberId: FiberId) => (f: (exit: Exit<E, A>) => any) => void) => {
45
+ const context = this.unsafeRunFiber(io);
44
46
  context.unsafeOnDone((exit) => k(exit.flatten));
45
47
  return (fiberId) => (k) => this.unsafeRunAsyncWith(context.interruptAs(fiberId), (exit) => k(exit.flatten));
46
48
  };
@@ -78,6 +80,11 @@ export const defaultRuntimeConfig = new RuntimeConfig({
78
80
 
79
81
  export const defaultRuntime = new Runtime(Environment.empty, defaultRuntimeConfig);
80
82
 
83
+ /**
84
+ * @tsplus fluent fncts.io.IO unsafeRunFiber
85
+ */
86
+ export const unsafeRunFiber = defaultRuntime.unsafeRunFiber;
87
+
81
88
  /**
82
89
  * @tsplus fluent fncts.io.IO unsafeRunAsync
83
90
  */
package/_src/STM/api.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { Journal} from "./internal/Journal.js";
2
+
1
3
  import { identity } from "@fncts/base/data/function";
2
4
  import { AtomicReference } from "@fncts/base/internal/AtomicReference";
3
5
  import { TxnId } from "@fncts/io/TxnId";
@@ -44,6 +46,13 @@ export function absolve<R, E, E1, A>(z: STM<R, E, Either<E1, A>>): STM<R, E | E1
44
46
  return z.flatMap(STM.fromEitherNow);
45
47
  }
46
48
 
49
+ /**
50
+ * @tsplus static fncts.io.STMOps Effect
51
+ */
52
+ export function makeEffect<R, E, A>(f: (journal: Journal, fiberId: FiberId, r: R) => A): STM<R, E, A> {
53
+ return new Effect(f);
54
+ }
55
+
47
56
  /**
48
57
  * Retrieves the environment inside an stm.
49
58
  *