@fncts/io 0.0.9 → 0.0.10

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 (81) hide show
  1. package/Channel/api.d.ts +27 -4
  2. package/Channel/internal/MergeDecision.d.ts +14 -0
  3. package/STM/api.d.ts +7 -0
  4. package/Sink/api.d.ts +455 -7
  5. package/TReentrantLock/api.d.ts +97 -0
  6. package/TReentrantLock/definition.d.ts +65 -0
  7. package/TReentrantLock.d.ts +2 -0
  8. package/_cjs/Cached/api.cjs +1 -1
  9. package/_cjs/Cached/api.cjs.map +1 -1
  10. package/_cjs/Channel/api/mapOutIOC.cjs +1 -1
  11. package/_cjs/Channel/api/mapOutIOC.cjs.map +1 -1
  12. package/_cjs/Channel/api/mergeAllWith.cjs +2 -2
  13. package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
  14. package/_cjs/Channel/api/mergeWith.cjs +1 -1
  15. package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
  16. package/_cjs/Channel/api.cjs +87 -32
  17. package/_cjs/Channel/api.cjs.map +1 -1
  18. package/_cjs/Channel/internal/MergeDecision.cjs +11 -2
  19. package/_cjs/Channel/internal/MergeDecision.cjs.map +1 -1
  20. package/_cjs/IO/api/foreachC.cjs +2 -2
  21. package/_cjs/IO/api/foreachC.cjs.map +1 -1
  22. package/_cjs/STM/api.cjs +15 -6
  23. package/_cjs/STM/api.cjs.map +1 -1
  24. package/_cjs/Sink/api.cjs +1180 -40
  25. package/_cjs/Sink/api.cjs.map +1 -1
  26. package/_cjs/Stream/api.cjs +28 -28
  27. package/_cjs/Stream/api.cjs.map +1 -1
  28. package/_cjs/TReentrantLock/api.cjs +297 -0
  29. package/_cjs/TReentrantLock/api.cjs.map +1 -0
  30. package/_cjs/TReentrantLock/definition.cjs +125 -0
  31. package/_cjs/TReentrantLock/definition.cjs.map +1 -0
  32. package/_cjs/TReentrantLock.cjs +32 -0
  33. package/_cjs/TReentrantLock.cjs.map +1 -0
  34. package/_cjs/collection/immutable/Conc/filterIO.cjs +35 -0
  35. package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -0
  36. package/_cjs/collection/immutable/Conc.cjs +13 -0
  37. package/_cjs/collection/immutable/Conc.cjs.map +1 -1
  38. package/_mjs/Cached/api.mjs +1 -1
  39. package/_mjs/Cached/api.mjs.map +1 -1
  40. package/_mjs/Channel/api/mapOutIOC.mjs +1 -1
  41. package/_mjs/Channel/api/mapOutIOC.mjs.map +1 -1
  42. package/_mjs/Channel/api/mergeAllWith.mjs +2 -2
  43. package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
  44. package/_mjs/Channel/api/mergeWith.mjs +1 -1
  45. package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
  46. package/_mjs/Channel/api.mjs +75 -30
  47. package/_mjs/Channel/api.mjs.map +1 -1
  48. package/_mjs/Channel/internal/MergeDecision.mjs +7 -0
  49. package/_mjs/Channel/internal/MergeDecision.mjs.map +1 -1
  50. package/_mjs/IO/api/foreachC.mjs +2 -2
  51. package/_mjs/IO/api/foreachC.mjs.map +1 -1
  52. package/_mjs/STM/api.mjs +13 -6
  53. package/_mjs/STM/api.mjs.map +1 -1
  54. package/_mjs/Sink/api.mjs +996 -31
  55. package/_mjs/Sink/api.mjs.map +1 -1
  56. package/_mjs/Stream/api.mjs +28 -28
  57. package/_mjs/Stream/api.mjs.map +1 -1
  58. package/_mjs/TReentrantLock/api.mjs +243 -0
  59. package/_mjs/TReentrantLock/api.mjs.map +1 -0
  60. package/_mjs/TReentrantLock/definition.mjs +102 -0
  61. package/_mjs/TReentrantLock/definition.mjs.map +1 -0
  62. package/_mjs/TReentrantLock.mjs +4 -0
  63. package/_mjs/TReentrantLock.mjs.map +1 -0
  64. package/_mjs/collection/immutable/Conc/filterIO.mjs +22 -0
  65. package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -0
  66. package/_mjs/collection/immutable/Conc.mjs +1 -0
  67. package/_mjs/collection/immutable/Conc.mjs.map +1 -1
  68. package/_src/Channel/api.ts +98 -11
  69. package/_src/Channel/internal/MergeDecision.ts +15 -0
  70. package/_src/IO/api.ts +1 -1
  71. package/_src/STM/api.ts +9 -0
  72. package/_src/Sink/api.ts +1350 -19
  73. package/_src/TFuture/definition.ts +1 -1
  74. package/_src/TReentrantLock/api.ts +193 -0
  75. package/_src/TReentrantLock/definition.ts +86 -0
  76. package/_src/TReentrantLock.ts +4 -0
  77. package/_src/collection/immutable/Conc/filterIO.ts +16 -0
  78. package/_src/collection/immutable/Conc.ts +1 -0
  79. package/collection/immutable/Conc/filterIO.d.ts +7 -0
  80. package/collection/immutable/Conc.d.ts +1 -0
  81. 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,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]}
@@ -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
  /**
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
  *