@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.
- package/Channel/api.d.ts +27 -4
- package/Channel/internal/MergeDecision.d.ts +14 -0
- package/STM/api.d.ts +7 -0
- package/Sink/api.d.ts +455 -7
- package/TReentrantLock/api.d.ts +97 -0
- package/TReentrantLock/definition.d.ts +65 -0
- package/TReentrantLock.d.ts +2 -0
- package/_cjs/Cached/api.cjs +1 -1
- package/_cjs/Cached/api.cjs.map +1 -1
- package/_cjs/Channel/api/mapOutIOC.cjs +1 -1
- package/_cjs/Channel/api/mapOutIOC.cjs.map +1 -1
- package/_cjs/Channel/api/mergeAllWith.cjs +2 -2
- package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
- package/_cjs/Channel/api/mergeWith.cjs +1 -1
- package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
- package/_cjs/Channel/api.cjs +87 -32
- package/_cjs/Channel/api.cjs.map +1 -1
- package/_cjs/Channel/internal/MergeDecision.cjs +11 -2
- package/_cjs/Channel/internal/MergeDecision.cjs.map +1 -1
- package/_cjs/IO/api/foreachC.cjs +2 -2
- package/_cjs/IO/api/foreachC.cjs.map +1 -1
- package/_cjs/STM/api.cjs +15 -6
- package/_cjs/STM/api.cjs.map +1 -1
- package/_cjs/Sink/api.cjs +1180 -40
- package/_cjs/Sink/api.cjs.map +1 -1
- package/_cjs/Stream/api.cjs +28 -28
- package/_cjs/Stream/api.cjs.map +1 -1
- package/_cjs/TReentrantLock/api.cjs +297 -0
- package/_cjs/TReentrantLock/api.cjs.map +1 -0
- package/_cjs/TReentrantLock/definition.cjs +125 -0
- package/_cjs/TReentrantLock/definition.cjs.map +1 -0
- package/_cjs/TReentrantLock.cjs +32 -0
- package/_cjs/TReentrantLock.cjs.map +1 -0
- package/_cjs/collection/immutable/Conc/filterIO.cjs +35 -0
- package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -0
- package/_cjs/collection/immutable/Conc.cjs +13 -0
- package/_cjs/collection/immutable/Conc.cjs.map +1 -1
- package/_mjs/Cached/api.mjs +1 -1
- package/_mjs/Cached/api.mjs.map +1 -1
- package/_mjs/Channel/api/mapOutIOC.mjs +1 -1
- package/_mjs/Channel/api/mapOutIOC.mjs.map +1 -1
- package/_mjs/Channel/api/mergeAllWith.mjs +2 -2
- package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
- package/_mjs/Channel/api/mergeWith.mjs +1 -1
- package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
- package/_mjs/Channel/api.mjs +75 -30
- package/_mjs/Channel/api.mjs.map +1 -1
- package/_mjs/Channel/internal/MergeDecision.mjs +7 -0
- package/_mjs/Channel/internal/MergeDecision.mjs.map +1 -1
- package/_mjs/IO/api/foreachC.mjs +2 -2
- package/_mjs/IO/api/foreachC.mjs.map +1 -1
- package/_mjs/STM/api.mjs +13 -6
- package/_mjs/STM/api.mjs.map +1 -1
- package/_mjs/Sink/api.mjs +996 -31
- package/_mjs/Sink/api.mjs.map +1 -1
- package/_mjs/Stream/api.mjs +28 -28
- package/_mjs/Stream/api.mjs.map +1 -1
- package/_mjs/TReentrantLock/api.mjs +243 -0
- package/_mjs/TReentrantLock/api.mjs.map +1 -0
- package/_mjs/TReentrantLock/definition.mjs +102 -0
- package/_mjs/TReentrantLock/definition.mjs.map +1 -0
- package/_mjs/TReentrantLock.mjs +4 -0
- package/_mjs/TReentrantLock.mjs.map +1 -0
- package/_mjs/collection/immutable/Conc/filterIO.mjs +22 -0
- package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -0
- package/_mjs/collection/immutable/Conc.mjs +1 -0
- package/_mjs/collection/immutable/Conc.mjs.map +1 -1
- package/_src/Channel/api.ts +98 -11
- package/_src/Channel/internal/MergeDecision.ts +15 -0
- package/_src/IO/api.ts +1 -1
- package/_src/STM/api.ts +9 -0
- package/_src/Sink/api.ts +1350 -19
- package/_src/TFuture/definition.ts +1 -1
- package/_src/TReentrantLock/api.ts +193 -0
- package/_src/TReentrantLock/definition.ts +86 -0
- package/_src/TReentrantLock.ts +4 -0
- package/_src/collection/immutable/Conc/filterIO.ts +16 -0
- package/_src/collection/immutable/Conc.ts +1 -0
- package/collection/immutable/Conc/filterIO.d.ts +7 -0
- package/collection/immutable/Conc.d.ts +1 -0
- 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 @@
|
|
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 +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/_src/Channel/api.ts
CHANGED
@@ -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.
|
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,
|
1182
|
-
return
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
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
|
*
|