@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.
- package/Channel/api.d.ts +27 -4
- package/Channel/internal/MergeDecision.d.ts +14 -0
- package/IO/runtime.d.ts +8 -1
- package/STM/api.d.ts +7 -0
- package/Sink/api.d.ts +637 -8
- 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/IO/runtime.cjs +18 -7
- package/_cjs/IO/runtime.cjs.map +1 -1
- package/_cjs/STM/api.cjs +15 -6
- package/_cjs/STM/api.cjs.map +1 -1
- package/_cjs/Sink/api.cjs +1475 -42
- package/_cjs/Sink/api.cjs.map +1 -1
- package/_cjs/Stream/api.cjs +29 -29
- 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/dropUntilIO.cjs +38 -0
- package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -0
- package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +38 -0
- package/_cjs/collection/immutable/Conc/dropWhileIO.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/_cjs/demo.cjs +15 -0
- package/_cjs/demo.cjs.map +1 -0
- 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/IO/runtime.mjs +15 -5
- package/_mjs/IO/runtime.mjs.map +1 -1
- package/_mjs/STM/api.mjs +13 -6
- package/_mjs/STM/api.mjs.map +1 -1
- package/_mjs/Sink/api.mjs +1287 -37
- package/_mjs/Sink/api.mjs.map +1 -1
- package/_mjs/Stream/api.mjs +29 -29
- 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/dropUntilIO.mjs +26 -0
- package/_mjs/collection/immutable/Conc/dropUntilIO.mjs.map +1 -0
- package/_mjs/collection/immutable/Conc/dropWhileIO.mjs +26 -0
- package/_mjs/collection/immutable/Conc/dropWhileIO.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/_mjs/demo.mjs +7 -0
- package/_mjs/demo.mjs.map +1 -0
- package/_src/Channel/api.ts +98 -11
- package/_src/Channel/internal/MergeDecision.ts +15 -0
- package/_src/IO/api.ts +1 -1
- package/_src/IO/runtime.ts +18 -11
- package/_src/STM/api.ts +9 -0
- package/_src/Sink/api.ts +1725 -36
- 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/dropUntilIO.ts +24 -0
- package/_src/collection/immutable/Conc/dropWhileIO.ts +26 -0
- package/_src/collection/immutable/Conc/filterIO.ts +16 -0
- package/_src/collection/immutable/Conc.ts +1 -0
- package/_src/demo.ts +6 -0
- package/collection/immutable/Conc/dropUntilIO.d.ts +7 -0
- package/collection/immutable/Conc/dropWhileIO.d.ts +7 -0
- package/collection/immutable/Conc/filterIO.d.ts +7 -0
- package/collection/immutable/Conc.d.ts +1 -0
- package/demo.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,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 +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]}
|
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/IO/runtime.ts
CHANGED
@@ -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
|
-
|
11
|
-
|
12
|
-
|
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
|
*
|