@fncts/io 0.0.34 → 0.0.36

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. package/Fiber/FiberRuntime.d.ts +7 -7
  2. package/Fiber/constructors.d.ts +5 -0
  3. package/IO/api/all.d.ts +41 -0
  4. package/IO/api/concurrency.d.ts +11 -0
  5. package/IO/api/interrupt.d.ts +1 -1
  6. package/IO/api/raceWith.d.ts +2 -1
  7. package/IO/api.d.ts +7 -2
  8. package/IO/definition.d.ts +103 -127
  9. package/IO.d.ts +1 -0
  10. package/Push/api.d.ts +86 -36
  11. package/Push/definition.d.ts +28 -13
  12. package/Push/internal.d.ts +7 -11
  13. package/RefSubject/Atomic.d.ts +8 -11
  14. package/RefSubject/Synchronized/definition.d.ts +4 -6
  15. package/RefSubject/api.d.ts +0 -1
  16. package/RefSubject/definition.d.ts +6 -8
  17. package/STM/definition.d.ts +19 -2
  18. package/Sink/api.d.ts +24 -24
  19. package/Subject/Atomic.d.ts +4 -6
  20. package/Subject/definition.d.ts +2 -2
  21. package/_cjs/Channel/api/runScoped.cjs +1 -1
  22. package/_cjs/Channel/api/runScoped.cjs.map +1 -1
  23. package/_cjs/Channel/api.cjs +2 -2
  24. package/_cjs/Channel/api.cjs.map +1 -1
  25. package/_cjs/Fiber/FiberRuntime.cjs +110 -98
  26. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  27. package/_cjs/Fiber/constructors.cjs +10 -2
  28. package/_cjs/Fiber/constructors.cjs.map +1 -1
  29. package/_cjs/Future/api.cjs +1 -1
  30. package/_cjs/Future/api.cjs.map +1 -1
  31. package/_cjs/IO/api/all.cjs +33 -0
  32. package/_cjs/IO/api/all.cjs.map +1 -0
  33. package/_cjs/IO/api/asyncIO.cjs +1 -1
  34. package/_cjs/IO/api/asyncIO.cjs.map +1 -1
  35. package/_cjs/IO/api/bracketExit.cjs +1 -1
  36. package/_cjs/IO/api/bracketExit.cjs.map +1 -1
  37. package/_cjs/IO/api/concurrency.cjs +25 -4
  38. package/_cjs/IO/api/concurrency.cjs.map +1 -1
  39. package/_cjs/IO/api/disconnect.cjs +1 -1
  40. package/_cjs/IO/api/disconnect.cjs.map +1 -1
  41. package/_cjs/IO/api/foreachConcurrent.cjs +1 -1
  42. package/_cjs/IO/api/foreachConcurrent.cjs.map +1 -1
  43. package/_cjs/IO/api/foreachExec.cjs +1 -1
  44. package/_cjs/IO/api/foreachExec.cjs.map +1 -1
  45. package/_cjs/IO/api/forkIn.cjs +1 -1
  46. package/_cjs/IO/api/forkIn.cjs.map +1 -1
  47. package/_cjs/IO/api/forkScoped.cjs +1 -1
  48. package/_cjs/IO/api/forkScoped.cjs.map +1 -1
  49. package/_cjs/IO/api/fulfill.cjs +1 -1
  50. package/_cjs/IO/api/fulfill.cjs.map +1 -1
  51. package/_cjs/IO/api/interrupt.cjs +18 -6
  52. package/_cjs/IO/api/interrupt.cjs.map +1 -1
  53. package/_cjs/IO/api/raceWith.cjs +4 -4
  54. package/_cjs/IO/api/raceWith.cjs.map +1 -1
  55. package/_cjs/IO/api/timeout.cjs +8 -5
  56. package/_cjs/IO/api/timeout.cjs.map +1 -1
  57. package/_cjs/IO/api/zipConcurrent.cjs +1 -1
  58. package/_cjs/IO/api/zipConcurrent.cjs.map +1 -1
  59. package/_cjs/IO/api.cjs +78 -20
  60. package/_cjs/IO/api.cjs.map +1 -1
  61. package/_cjs/IO/definition.cjs +14 -191
  62. package/_cjs/IO/definition.cjs.map +1 -1
  63. package/_cjs/IO.cjs +11 -0
  64. package/_cjs/IO.cjs.map +1 -1
  65. package/_cjs/Layer/MemoMap.cjs +1 -1
  66. package/_cjs/Layer/MemoMap.cjs.map +1 -1
  67. package/_cjs/Layer/api.cjs.map +1 -1
  68. package/_cjs/Push/api.cjs +238 -168
  69. package/_cjs/Push/api.cjs.map +1 -1
  70. package/_cjs/Push/definition.cjs +12 -13
  71. package/_cjs/Push/definition.cjs.map +1 -1
  72. package/_cjs/Push/internal.cjs +37 -29
  73. package/_cjs/Push/internal.cjs.map +1 -1
  74. package/_cjs/RefSubject/Atomic.cjs +15 -19
  75. package/_cjs/RefSubject/Atomic.cjs.map +1 -1
  76. package/_cjs/RefSubject/Synchronized/definition.cjs +9 -10
  77. package/_cjs/RefSubject/Synchronized/definition.cjs.map +1 -1
  78. package/_cjs/RefSubject/api.cjs +5 -6
  79. package/_cjs/RefSubject/api.cjs.map +1 -1
  80. package/_cjs/RefSubject/definition.cjs.map +1 -1
  81. package/_cjs/STM/api/atomically.cjs +1 -1
  82. package/_cjs/STM/api/atomically.cjs.map +1 -1
  83. package/_cjs/STM/api.cjs +2 -2
  84. package/_cjs/STM/api.cjs.map +1 -1
  85. package/_cjs/STM/definition.cjs +1 -1
  86. package/_cjs/STM/definition.cjs.map +1 -1
  87. package/_cjs/ScopedRef/api.cjs +2 -2
  88. package/_cjs/ScopedRef/api.cjs.map +1 -1
  89. package/_cjs/Semaphore.cjs +1 -1
  90. package/_cjs/Semaphore.cjs.map +1 -1
  91. package/_cjs/Sink/api.cjs +13 -13
  92. package/_cjs/Sink/api.cjs.map +1 -1
  93. package/_cjs/Subject/Atomic.cjs +4 -5
  94. package/_cjs/Subject/Atomic.cjs.map +1 -1
  95. package/_cjs/TReentrantLock/api.cjs +2 -2
  96. package/_cjs/TReentrantLock/api.cjs.map +1 -1
  97. package/_cjs/TSemaphore/api.cjs +1 -1
  98. package/_cjs/TSemaphore/api.cjs.map +1 -1
  99. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs +12 -17
  100. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -1
  101. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +12 -17
  102. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs.map +1 -1
  103. package/_cjs/collection/immutable/Conc/filterIO.cjs +2 -12
  104. package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -1
  105. package/_cjs/collection/immutable/Conc/mapIO.cjs +3 -9
  106. package/_cjs/collection/immutable/Conc/mapIO.cjs.map +1 -1
  107. package/_cjs/collection/immutable/Conc/takeWhileIO.cjs +11 -27
  108. package/_cjs/collection/immutable/Conc/takeWhileIO.cjs.map +1 -1
  109. package/_mjs/Channel/api/runScoped.mjs +1 -1
  110. package/_mjs/Channel/api/runScoped.mjs.map +1 -1
  111. package/_mjs/Channel/api.mjs +2 -2
  112. package/_mjs/Channel/api.mjs.map +1 -1
  113. package/_mjs/Fiber/FiberRuntime.mjs +111 -100
  114. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  115. package/_mjs/Fiber/constructors.mjs +7 -1
  116. package/_mjs/Fiber/constructors.mjs.map +1 -1
  117. package/_mjs/Future/api.mjs +1 -1
  118. package/_mjs/Future/api.mjs.map +1 -1
  119. package/_mjs/IO/api/all.mjs +24 -0
  120. package/_mjs/IO/api/all.mjs.map +1 -0
  121. package/_mjs/IO/api/asyncIO.mjs +1 -1
  122. package/_mjs/IO/api/asyncIO.mjs.map +1 -1
  123. package/_mjs/IO/api/bracketExit.mjs +1 -1
  124. package/_mjs/IO/api/bracketExit.mjs.map +1 -1
  125. package/_mjs/IO/api/concurrency.mjs +19 -2
  126. package/_mjs/IO/api/concurrency.mjs.map +1 -1
  127. package/_mjs/IO/api/disconnect.mjs +1 -1
  128. package/_mjs/IO/api/disconnect.mjs.map +1 -1
  129. package/_mjs/IO/api/foreachConcurrent.mjs +1 -1
  130. package/_mjs/IO/api/foreachConcurrent.mjs.map +1 -1
  131. package/_mjs/IO/api/foreachExec.mjs +1 -1
  132. package/_mjs/IO/api/foreachExec.mjs.map +1 -1
  133. package/_mjs/IO/api/forkIn.mjs +1 -1
  134. package/_mjs/IO/api/forkIn.mjs.map +1 -1
  135. package/_mjs/IO/api/forkScoped.mjs +1 -1
  136. package/_mjs/IO/api/forkScoped.mjs.map +1 -1
  137. package/_mjs/IO/api/fulfill.mjs +1 -1
  138. package/_mjs/IO/api/fulfill.mjs.map +1 -1
  139. package/_mjs/IO/api/interrupt.mjs +19 -7
  140. package/_mjs/IO/api/interrupt.mjs.map +1 -1
  141. package/_mjs/IO/api/raceWith.mjs +4 -4
  142. package/_mjs/IO/api/raceWith.mjs.map +1 -1
  143. package/_mjs/IO/api/timeout.mjs +8 -5
  144. package/_mjs/IO/api/timeout.mjs.map +1 -1
  145. package/_mjs/IO/api/zipConcurrent.mjs +1 -1
  146. package/_mjs/IO/api/zipConcurrent.mjs.map +1 -1
  147. package/_mjs/IO/api.mjs +78 -23
  148. package/_mjs/IO/api.mjs.map +1 -1
  149. package/_mjs/IO/definition.mjs +12 -181
  150. package/_mjs/IO/definition.mjs.map +1 -1
  151. package/_mjs/IO.mjs +1 -0
  152. package/_mjs/IO.mjs.map +1 -1
  153. package/_mjs/Layer/MemoMap.mjs +1 -1
  154. package/_mjs/Layer/MemoMap.mjs.map +1 -1
  155. package/_mjs/Layer/api.mjs.map +1 -1
  156. package/_mjs/Push/api.mjs +223 -166
  157. package/_mjs/Push/api.mjs.map +1 -1
  158. package/_mjs/Push/definition.mjs +9 -10
  159. package/_mjs/Push/definition.mjs.map +1 -1
  160. package/_mjs/Push/internal.mjs +33 -22
  161. package/_mjs/Push/internal.mjs.map +1 -1
  162. package/_mjs/RefSubject/Atomic.mjs +15 -19
  163. package/_mjs/RefSubject/Atomic.mjs.map +1 -1
  164. package/_mjs/RefSubject/Synchronized/definition.mjs +9 -10
  165. package/_mjs/RefSubject/Synchronized/definition.mjs.map +1 -1
  166. package/_mjs/RefSubject/api.mjs +6 -7
  167. package/_mjs/RefSubject/api.mjs.map +1 -1
  168. package/_mjs/RefSubject/definition.mjs.map +1 -1
  169. package/_mjs/STM/api/atomically.mjs +1 -1
  170. package/_mjs/STM/api/atomically.mjs.map +1 -1
  171. package/_mjs/STM/api.mjs +2 -2
  172. package/_mjs/STM/api.mjs.map +1 -1
  173. package/_mjs/STM/definition.mjs +1 -1
  174. package/_mjs/STM/definition.mjs.map +1 -1
  175. package/_mjs/ScopedRef/api.mjs +2 -2
  176. package/_mjs/ScopedRef/api.mjs.map +1 -1
  177. package/_mjs/Semaphore.mjs +1 -1
  178. package/_mjs/Semaphore.mjs.map +1 -1
  179. package/_mjs/Sink/api.mjs +10 -10
  180. package/_mjs/Sink/api.mjs.map +1 -1
  181. package/_mjs/Subject/Atomic.mjs +4 -5
  182. package/_mjs/Subject/Atomic.mjs.map +1 -1
  183. package/_mjs/TReentrantLock/api.mjs +2 -2
  184. package/_mjs/TReentrantLock/api.mjs.map +1 -1
  185. package/_mjs/TSemaphore/api.mjs +1 -1
  186. package/_mjs/TSemaphore/api.mjs.map +1 -1
  187. package/_mjs/collection/immutable/Conc/dropUntilIO.mjs +12 -17
  188. package/_mjs/collection/immutable/Conc/dropUntilIO.mjs.map +1 -1
  189. package/_mjs/collection/immutable/Conc/dropWhileIO.mjs +12 -17
  190. package/_mjs/collection/immutable/Conc/dropWhileIO.mjs.map +1 -1
  191. package/_mjs/collection/immutable/Conc/filterIO.mjs +2 -12
  192. package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -1
  193. package/_mjs/collection/immutable/Conc/mapIO.mjs +3 -9
  194. package/_mjs/collection/immutable/Conc/mapIO.mjs.map +1 -1
  195. package/_mjs/collection/immutable/Conc/takeWhileIO.mjs +11 -27
  196. package/_mjs/collection/immutable/Conc/takeWhileIO.mjs.map +1 -1
  197. package/_src/Channel/api.ts +3 -3
  198. package/_src/Fiber/FiberRuntime.ts +76 -75
  199. package/_src/Fiber/constructors.ts +5 -0
  200. package/_src/IO/api/all.ts +64 -0
  201. package/_src/IO/api/concurrency.ts +33 -0
  202. package/_src/IO/api/foreachExec.ts +2 -2
  203. package/_src/IO/api/interrupt.ts +20 -7
  204. package/_src/IO/api/raceWith.ts +4 -2
  205. package/_src/IO/api/timeout.ts +21 -1
  206. package/_src/IO/api.ts +79 -27
  207. package/_src/IO/definition.ts +155 -200
  208. package/_src/IO.ts +1 -0
  209. package/_src/Layer/api.ts +0 -1
  210. package/_src/Push/api.ts +305 -304
  211. package/_src/Push/definition.ts +19 -17
  212. package/_src/Push/internal.ts +63 -31
  213. package/_src/RefSubject/Atomic.ts +16 -22
  214. package/_src/RefSubject/Synchronized/definition.ts +6 -9
  215. package/_src/RefSubject/api.ts +9 -12
  216. package/_src/RefSubject/definition.ts +6 -8
  217. package/_src/STM/api.ts +0 -5
  218. package/_src/STM/definition.ts +8 -2
  219. package/_src/Sink/api.ts +9 -9
  220. package/_src/Subject/Atomic.ts +6 -8
  221. package/_src/Subject/definition.ts +2 -2
  222. package/_src/collection/immutable/Conc/dropUntilIO.ts +18 -15
  223. package/_src/collection/immutable/Conc/dropWhileIO.ts +18 -17
  224. package/_src/collection/immutable/Conc/filterIO.ts +1 -11
  225. package/_src/collection/immutable/Conc/mapIO.ts +2 -9
  226. package/_src/collection/immutable/Conc/takeWhileIO.ts +19 -28
  227. package/collection/immutable/Conc/filterIO.d.ts +1 -1
  228. package/collection/immutable/Conc/mapIO.d.ts +1 -1
  229. package/collection/immutable/Conc/takeWhileIO.d.ts +1 -1
  230. package/package.json +2 -2
@@ -15,37 +15,39 @@ export class Push<R, E, A> {
15
15
  readonly _E: (_: never) => E;
16
16
  readonly _A: (_: never) => A;
17
17
  };
18
- constructor(readonly run: <R1>(emitter: Emitter<R1, E, A>) => IO<R | R1 | Scope, never, unknown>) {}
18
+ constructor(readonly run: <R1>(emitter: Sink<R1, E, A>) => IO<R | R1, never, unknown>) {}
19
+ }
20
+
21
+ export declare namespace Push {
22
+ export type EnvironmentOf<X> = [X] extends [{ [PushVariance]: { readonly _R: (_: never) => infer R } }] ? R : never;
23
+ export type ErrorOf<X> = [X] extends [{ [PushVariance]: { readonly _E: (_: never) => infer E } }] ? E : never;
24
+ export type ValueOf<X> = [X] extends [{ [PushVariance]: { readonly _A: (_: never) => infer A } }] ? A : never;
19
25
  }
20
26
 
21
27
  /**
22
- * @tsplus type fncts.io.Push.Emitter
23
- * @tsplus companion fncts.io.Push.EmitterOps
28
+ * @tsplus type fncts.io.Push.Sink
29
+ * @tsplus companion fncts.io.Push.SinkOps
24
30
  */
25
- export class Emitter<R, E, A> {
31
+ export class Sink<R, E, A> {
26
32
  constructor(
27
- readonly emit: (value: A) => IO<R, never, unknown>,
28
- readonly failCause: (cause: Cause<E>) => IO<R, never, void>,
29
- readonly end: IO<R, never, void>,
33
+ readonly event: (value: A) => IO<R, never, void>,
34
+ readonly error: (cause: Cause<E>) => IO<R, never, void>,
30
35
  ) {}
31
36
  }
32
37
 
33
38
  /**
34
39
  * @tsplus static fncts.io.PushOps __call
35
40
  */
36
- export function makePush<R, E, A>(
37
- run: <R1>(emitter: Emitter<R1, E, A>) => IO<R | R1 | Scope, never, unknown>,
38
- ): Push<R, E, A> {
41
+ export function makePush<R, E, A>(run: <R1>(sink: Sink<R1, E, A>) => IO<R | R1, never, unknown>): Push<R, E, A> {
39
42
  return new Push(run);
40
43
  }
41
44
 
42
45
  /**
43
- * @tsplus static fncts.io.Push.EmitterOps __call
46
+ * @tsplus static fncts.io.Push.SinkOps __call
44
47
  */
45
- export function makeEmitter<R, E, A>(
46
- emit: (value: A) => IO<R, never, unknown>,
47
- failCause: (cause: Cause<E>) => IO<R, never, unknown>,
48
- end: IO<R, never, unknown>,
49
- ): Emitter<R, E, A> {
50
- return new Emitter(emit, failCause, end);
48
+ export function makeSink<R, E, A>(
49
+ value: (value: A) => IO<R, never, unknown>,
50
+ error: (cause: Cause<E>) => IO<R, never, unknown>,
51
+ ): Sink<R, E, A> {
52
+ return new Sink(value, error);
51
53
  }
@@ -1,39 +1,71 @@
1
- export function withCountdownLatch<R, E, A, R1, E1, B>(
2
- n: number,
3
- f: (latch: CountdownLatch) => IO<R, E, A>,
4
- onEnd: IO<R1, E1, B>,
5
- ): IO<R | R1, E | E1, B> {
6
- return Do((Δ) => {
7
- const latch = Δ(CountdownLatch(n));
8
- Δ(f(latch));
9
- return Δ(latch.await > onEnd);
10
- });
1
+ import type { RuntimeFiber } from "@fncts/io/Fiber";
2
+
3
+ export function withScopedFork<R, E, A>(
4
+ f: (fork: <R, E, A>(io: IO<R, E, A>) => IO<R, never, RuntimeFiber<E, A>>) => IO<R, E, A>,
5
+ ): IO<R, E, A> {
6
+ return IO.bracketExit(
7
+ Scope.make,
8
+ (scope) => f((io) => io.forkIn(scope)),
9
+ (scope, exit) => scope.close(exit),
10
+ );
11
11
  }
12
12
 
13
- export const EarlyExitTypeId = Symbol.for("fncts.io.Push.EarlyExit");
14
- export type EarlyExitTypeId = typeof EarlyExitTypeId;
13
+ export function withSwitch<R, E, A>(f: (fork: <R>(io: URIO<R, void>) => URIO<R, void>) => IO<R, E, A>) {
14
+ return withScopedFork((fork) =>
15
+ Do((Δ) => {
16
+ const ref = Δ(Ref.Synchronized.make<Fiber<never, void>>(Fiber.unit));
17
+
18
+ const switchFork = <R>(io: URIO<R, void>) => {
19
+ return ref.updateIO((currentFiber) => currentFiber.interruptFork.flatMap(() => fork(io)));
20
+ };
21
+
22
+ Δ(f(switchFork));
23
+
24
+ const fiber = Δ(ref.get);
15
25
 
16
- export class EarlyExit {
17
- readonly [EarlyExitTypeId]: EarlyExitTypeId = EarlyExitTypeId;
26
+ Δ(fiber.join.when(fiber !== undefined));
27
+ }),
28
+ );
18
29
  }
19
30
 
20
- export function isEarlyExit(u: unknown): u is EarlyExit {
21
- return isObject(u) && EarlyExitTypeId in u;
31
+ export function withUnboundedConcurrency<R, E, A>(
32
+ f: (fork: <R>(io: URIO<R, void>) => URIO<R, RuntimeFiber<never, void>>) => IO<R, E, A>,
33
+ ) {
34
+ return withScopedFork((fork) =>
35
+ Do((Δ) => {
36
+ const fibers = Δ(IO.succeed(new Set<RuntimeFiber<never, void>>()));
37
+ Δ(
38
+ f((io) =>
39
+ Do((Δ) => {
40
+ const fiber = Δ(fork(io));
41
+ Δ(IO(fibers.add(fiber)));
42
+ Δ(fork(fiber.join.ensuring(IO(fibers.delete(fiber)))));
43
+ return fiber;
44
+ }),
45
+ ),
46
+ );
47
+ Δ(Fiber.joinAll(fibers));
48
+ }),
49
+ );
22
50
  }
23
51
 
24
- export const earlyExit = IO.haltNow(new EarlyExit());
25
-
26
- export function onEarlyExit<R1, E1, B>(onEarlyExit: IO<R1, E1, B>) {
27
- return <R, E, A>(self: IO<R, E, A>): IO<R | R1, E | E1, A | B> => {
28
- return self.matchCauseIO(
29
- (cause) =>
30
- cause
31
- .find((cause) => (cause.isHalt() && isEarlyExit(cause.value) ? Just(cause) : Nothing()))
32
- .match(
33
- () => IO.failCauseNow(cause),
34
- () => onEarlyExit,
35
- ),
36
- IO.succeedNow,
37
- );
38
- };
52
+ export function withExhaust<R, E, A>(f: (fork: <R>(io: URIO<R, void>) => URIO<R, void>) => IO<R, E, A>) {
53
+ return withScopedFork((fork) =>
54
+ Do((Δ) => {
55
+ const ref = Δ(Ref.make<RuntimeFiber<never, void> | null>(null));
56
+ const reset = ref.set(null);
57
+
58
+ const exhaustFork = <R>(io: IO<R, never, void>) =>
59
+ io
60
+ .ensuring(reset)
61
+ .fork.flatMap((fiber) => ref.set(fiber))
62
+ .whenRef(ref, (fiber) => fiber === null).asUnit;
63
+
64
+ Δ(f(exhaustFork));
65
+
66
+ const fiber = Δ(ref.get);
67
+
68
+ Δ(IO.defer(fiber === null ? IO.unit : fiber.join));
69
+ }),
70
+ );
39
71
  }
@@ -1,4 +1,4 @@
1
- import type { Emitter } from "@fncts/io/Push";
1
+ import type { Sink } from "@fncts/io/Push";
2
2
 
3
3
  import { AtomicReference } from "@fncts/base/internal/AtomicReference";
4
4
  import { Hold, Push } from "@fncts/io/Push";
@@ -7,7 +7,7 @@ import { RefSubjectInternal } from "@fncts/io/RefSubject/definition";
7
7
 
8
8
  export class AtomicRefSubject<E, A> extends RefSubjectInternal<never, E, A, A> {
9
9
  readonly stream = new Hold<never, E, A>(Push.never);
10
- readonly maybeRef = new Atomic(this.stream.value);
10
+ readonly maybeRef = new Atomic(this.stream.current);
11
11
  readonly ref = new AtomicEmitRef(
12
12
  new AtomicDimapRef(
13
13
  this.maybeRef,
@@ -19,7 +19,7 @@ export class AtomicRefSubject<E, A> extends RefSubjectInternal<never, E, A, A> {
19
19
 
20
20
  constructor(readonly initial: A) {
21
21
  super();
22
- this.stream.value.set(Just(initial));
22
+ this.stream.current.set(Just(initial));
23
23
  }
24
24
 
25
25
  get get() {
@@ -38,30 +38,24 @@ export class AtomicRefSubject<E, A> extends RefSubjectInternal<never, E, A, A> {
38
38
  return this.ref.modify(f);
39
39
  }
40
40
 
41
- run<R>(emitter: Emitter<R, E, A>): IO<Scope | R, never, unknown> {
41
+ run<R>(emitter: Sink<R, E, A>): IO<R, never, unknown> {
42
42
  return this.stream.run(emitter);
43
43
  }
44
44
 
45
- emit(value: A): IO<never, never, void> {
46
- return this.stream.emit(value);
45
+ event(value: A): IO<never, never, void> {
46
+ return this.stream.event(value);
47
47
  }
48
48
 
49
- failCause(cause: Cause<E>): IO<never, never, void> {
50
- return this.stream.failCause(cause);
49
+ error(cause: Cause<E>): IO<never, never, void> {
50
+ return this.stream.error(cause);
51
51
  }
52
52
 
53
- end: IO<never, never, void> = this.stream.end;
54
-
55
- unsafeEmit(value: A): void {
56
- this.stream.emit(value).unsafeRunFiber();
57
- }
58
-
59
- unsafeFailCause(cause: Cause<E>): void {
60
- this.stream.failCause(cause).unsafeRunFiber();
53
+ unsafeEvent(value: A): void {
54
+ this.stream.event(value).unsafeRunFiber();
61
55
  }
62
56
 
63
- unsafeEnd(): void {
64
- this.stream.end.unsafeRunFiber();
57
+ unsafeError(cause: Cause<E>): void {
58
+ this.stream.error(cause).unsafeRunFiber();
65
59
  }
66
60
 
67
61
  get unsafeGet(): A {
@@ -97,7 +91,7 @@ class AtomicDimapRef<A, B> extends Atomic<B> {
97
91
  }
98
92
 
99
93
  class AtomicEmitRef<E, A> extends Atomic<A> {
100
- constructor(readonly ref: Atomic<A>, readonly emitter: Emitter<never, E, A>) {
94
+ constructor(readonly ref: Atomic<A>, readonly sink: Sink<never, E, A>) {
101
95
  super(ref.value);
102
96
  }
103
97
 
@@ -111,14 +105,14 @@ class AtomicEmitRef<E, A> extends Atomic<A> {
111
105
 
112
106
  unsafeSet(value: A) {
113
107
  this.ref.unsafeSet(value);
114
- this.emitter.emit(value).unsafeRunFiber();
108
+ this.sink.event(value).unsafeRunFiber();
115
109
  }
116
110
 
117
111
  set(value: A, __tsplusTrace?: string) {
118
- return this.ref.set(value) < this.emitter.emit(value);
112
+ return this.ref.set(value) < this.sink.event(value);
119
113
  }
120
114
 
121
115
  modify<B>(f: (a: A) => readonly [B, A], __tsplusTrace?: string) {
122
- return this.ref.modify(f) < this.ref.get.flatMap((value) => this.emitter.emit(value));
116
+ return this.ref.modify(f) < this.ref.get.flatMap((value) => this.sink.event(value));
123
117
  }
124
118
  }
@@ -1,7 +1,6 @@
1
1
  import type { RefSubject } from "../definition.js";
2
2
  import type { Cause } from "@fncts/base/data/Cause";
3
- import type { Emitter } from "@fncts/io/Push";
4
- import type { Scope } from "@fncts/io/Scope";
3
+ import type { Sink } from "@fncts/io/Push";
5
4
 
6
5
  import { IO } from "@fncts/io/IO";
7
6
 
@@ -44,7 +43,7 @@ export class SynchronizedRefSubjectInternal<R, E, A, B>
44
43
  return this.withPermit(this.ref.set(a));
45
44
  }
46
45
 
47
- run<R1>(emitter: Emitter<R1, E, B>): IO<Scope | R | R1, never, void> {
46
+ run<R1>(emitter: Sink<R1, E, B>): IO<R | R1, never, void> {
48
47
  return this.ref.run(emitter);
49
48
  }
50
49
 
@@ -56,16 +55,14 @@ export class SynchronizedRefSubjectInternal<R, E, A, B>
56
55
  return this.withPermit(this.ref.get.flatMap(f).flatMap(([b, a]) => this.ref.set(a).as(b)));
57
56
  }
58
57
 
59
- emit(value: A): IO<R, never, void> {
60
- return this.withPermit(this.ref.emit(value));
58
+ event(value: A): IO<R, never, void> {
59
+ return this.withPermit(this.ref.event(value));
61
60
  }
62
61
 
63
- failCause(cause: Cause<E>): IO<R, never, void> {
64
- return this.withPermit(this.ref.failCause(cause));
62
+ error(cause: Cause<E>): IO<R, never, void> {
63
+ return this.withPermit(this.ref.error(cause));
65
64
  }
66
65
 
67
- end: IO<R, never, void> = this.withPermit(this.ref.end);
68
-
69
66
  withPermit<R, E, A>(io: IO<R, E, A>, __tsplusTrace?: string): IO<R, E, A> {
70
67
  return this.semaphore.withPermit(io);
71
68
  }
@@ -1,5 +1,5 @@
1
1
  import { tuple } from "@fncts/base/data/function";
2
- import { Emitter } from "@fncts/io/Push";
2
+ import { Sink } from "@fncts/io/Push";
3
3
  import { AtomicRefSubject } from "@fncts/io/RefSubject/Atomic";
4
4
 
5
5
  import { RefSubject } from "./definition.js";
@@ -64,26 +64,23 @@ class Dimap<R, E, A, B, C, D> extends RefSubjectInternal<R, E, C, D> {
64
64
  });
65
65
  }
66
66
 
67
- run<R1>(emitter: Emitter<R1, E, D>): IO<Scope | R | R1, never, void> {
67
+ run<R1>(emitter: Sink<R1, E, D>): IO<R | R1, never, void> {
68
68
  return this.ref.run(
69
- Emitter(
70
- (value) => emitter.emit(this.g(value)),
71
- (cause) => emitter.failCause(cause),
72
- emitter.end,
69
+ Sink(
70
+ (value) => emitter.event(this.g(value)),
71
+ (cause) => emitter.error(cause),
73
72
  ),
74
73
  );
75
74
  }
76
75
 
77
- emit(value: C): IO<R, never, void> {
78
- return this.ref.emit(this.f(value));
76
+ event(value: C): IO<R, never, void> {
77
+ return this.ref.event(this.f(value));
79
78
  }
80
79
 
81
- failCause(cause: Cause<E>): IO<R, never, void> {
82
- return this.ref.failCause(cause);
80
+ error(cause: Cause<E>): IO<R, never, void> {
81
+ return this.ref.error(cause);
83
82
  }
84
83
 
85
- end: IO<R, never, void> = this.ref.end;
86
-
87
84
  get unsafeGet(): D {
88
85
  return this.g(this.ref.unsafeGet);
89
86
  }
@@ -1,4 +1,4 @@
1
- import type { Emitter } from "../Push.js";
1
+ import type { Sink } from "../Push.js";
2
2
  import type { Push } from "../Push.js";
3
3
  import type { ModifiableRef, ReadableRef, WritableRef } from "../Ref.js";
4
4
  import type { SynchronizedRefSubject } from "@fncts/io/RefSubject/Synchronized/definition";
@@ -10,7 +10,7 @@ import { RefVariance } from "../Ref.js";
10
10
  /**
11
11
  * @tsplus type fncts.io.Push.RefSubject
12
12
  */
13
- export interface RefSubject<out R, in out E, in A, out B> extends Push<R, E, B>, Emitter<R, E, A> {}
13
+ export interface RefSubject<out R, in out E, in A, out B> extends Push<R, E, B>, Sink<R, E, A> {}
14
14
 
15
15
  /**
16
16
  * @tsplus type fncts.io.Push.RefSubjectOps
@@ -29,7 +29,7 @@ export abstract class RefSubjectInternal<R, E, A, B>
29
29
  WritableRef<R, never, A>,
30
30
  ModifiableRef<R, R, never, never, A, B>,
31
31
  Push<R, E, B>,
32
- Emitter<R, E, A>
32
+ Sink<R, E, A>
33
33
  {
34
34
  readonly [PushTypeId]: PushTypeId = PushTypeId;
35
35
  declare [RefVariance]: {
@@ -52,13 +52,11 @@ export abstract class RefSubjectInternal<R, E, A, B>
52
52
 
53
53
  abstract modify<C>(f: (b: B) => readonly [C, A], __tsplusTrace?: string): IO<R, never, C>;
54
54
 
55
- abstract run<R1>(emitter: Emitter<R1, E, B>): IO<Scope | R | R1, never, void>;
55
+ abstract run<R1>(emitter: Sink<R1, E, B>): IO<R | R1, never, void>;
56
56
 
57
- abstract failCause(cause: Cause<E>): IO<R, never, void>;
57
+ abstract error(cause: Cause<E>): IO<R, never, void>;
58
58
 
59
- abstract emit(value: A): IO<R, never, void>;
60
-
61
- abstract end: IO<R, never, void>;
59
+ abstract event(value: A): IO<R, never, void>;
62
60
 
63
61
  abstract get unsafeGet(): B;
64
62
  }
package/_src/STM/api.ts CHANGED
@@ -1,13 +1,8 @@
1
1
  import type { Journal } from "./internal/Journal.js";
2
2
 
3
3
  import { identity } from "@fncts/base/data/function";
4
- import { AtomicReference } from "@fncts/base/internal/AtomicReference";
5
- import { TxnId } from "@fncts/io/TxnId";
6
4
 
7
5
  import { ContramapEnvironment, Effect, HaltException, STM } from "./definition.js";
8
- import { CommitState } from "./internal/CommitState.js";
9
- import { tryCommitAsync, tryCommitSync } from "./internal/Journal.js";
10
- import { TryCommitTag } from "./internal/TryCommit.js";
11
6
 
12
7
  /**
13
8
  * Maps the success value of this effect to the specified constant value.
@@ -1,7 +1,7 @@
1
1
  import type { Journal } from "./internal/Journal.js";
2
2
  import type { _A, _E, _R } from "@fncts/base/types";
3
3
 
4
- import { IOOpCode, IOTypeId, IOVariance } from "@fncts/io/IO/definition";
4
+ import { IOTag, IOTypeId, IOVariance } from "@fncts/io/IO/definition";
5
5
 
6
6
  export const enum STMTag {
7
7
  Effect = "Effect",
@@ -25,7 +25,7 @@ export type STMTypeId = typeof STMTypeId;
25
25
  */
26
26
  export abstract class STM<R, E, A> {
27
27
  readonly [IOTypeId]: IOTypeId = IOTypeId;
28
- readonly _tag = IOOpCode.Commit;
28
+ readonly _tag = IOTag.Commit;
29
29
  readonly trace?: string;
30
30
  readonly [STMTypeId]: STMTypeId = STMTypeId;
31
31
  declare [IOVariance]: {
@@ -40,6 +40,12 @@ export abstract class STM<R, E, A> {
40
40
  };
41
41
  }
42
42
 
43
+ export declare namespace STM {
44
+ type EnvironmentOf<X> = [X] extends [{ [STMVariance]: { _R: () => infer R } }] ? R : never;
45
+ type ErrorOf<X> = [X] extends [{ [STMVariance]: { _E: () => infer E } }] ? E : never;
46
+ type ValueOf<X> = [X] extends [{ [STMVariance]: { _A: () => infer A } }] ? A : never;
47
+ }
48
+
43
49
  /**
44
50
  * @tsplus unify fncts.io.STM
45
51
  */
package/_src/Sink/api.ts CHANGED
@@ -17,7 +17,7 @@ export function zipLeft<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
17
17
  }
18
18
 
19
19
  /**
20
- * Like {@link zipC}, but keeps only the result from this sink
20
+ * Like {@link zipConcurrent}, but keeps only the result from this sink
21
21
  *
22
22
  * @tsplus pipeable fncts.io.Sink zipLeftC
23
23
  */
@@ -26,7 +26,7 @@ export function zipLeftC<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
26
26
  __tsplusTrace?: string,
27
27
  ) {
28
28
  return <R, E, Z>(self: Sink<R, E, In, L, Z>): Sink<R | R1, E | E1, In & In1, L | L1, Z> => {
29
- return self.zipWithC(that, (z, _) => z);
29
+ return self.zipWithConcurrent(that, (z, _) => z);
30
30
  };
31
31
  }
32
32
 
@@ -45,7 +45,7 @@ export function zipRight<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
45
45
  }
46
46
 
47
47
  /**
48
- * Like {@link zipC}, but keeps only the result from the `that` sink
48
+ * Like {@link zipConcurrent}, but keeps only the result from the `that` sink
49
49
  *
50
50
  * @tsplus pipeable fncts.io.Sink zipRightC
51
51
  */
@@ -54,7 +54,7 @@ export function zipRightC<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
54
54
  __tsplusTrace?: string,
55
55
  ) {
56
56
  return <R, E, Z>(self: Sink<R, E, In, L, Z>): Sink<R | R1, E | E1, In & In1, L | L1, Z1> => {
57
- return self.zipWithC(that, (_, z1) => z1);
57
+ return self.zipWithConcurrent(that, (_, z1) => z1);
58
58
  };
59
59
  }
60
60
 
@@ -1704,14 +1704,14 @@ export function zip<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
1704
1704
  * Runs both sinks in parallel on the input and combines the results in a
1705
1705
  * tuple.
1706
1706
  *
1707
- * @tsplus pipeable fncts.io.Sink zipC
1707
+ * @tsplus pipeable fncts.io.Sink zipConcurrent
1708
1708
  */
1709
- export function zipC<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
1709
+ export function zipConcurrent<In, L, R1, E1, In1 extends In, L1 extends L, Z1>(
1710
1710
  that: Lazy<Sink<R1, E1, In1, L1, Z1>>,
1711
1711
  __tsplusTrace?: string,
1712
1712
  ) {
1713
1713
  return <R, E, Z>(self: Sink<R, E, In, L, Z>): Sink<R | R1, E | E1, In & In1, L | L1, readonly [Z, Z1]> => {
1714
- return self.zipWithC(that, Function.tuple);
1714
+ return self.zipWithConcurrent(that, Function.tuple);
1715
1715
  };
1716
1716
  }
1717
1717
 
@@ -1736,9 +1736,9 @@ export function zipWith<In, L, Z, R1, E1, In1 extends In, L1 extends L, Z1, Z2>(
1736
1736
  * Runs both sinks in parallel on the input and combines the results using the
1737
1737
  * provided function.
1738
1738
  *
1739
- * @tsplus pipeable fncts.io.Sink zipWithC
1739
+ * @tsplus pipeable fncts.io.Sink zipWithConcurrent
1740
1740
  */
1741
- export function zipWithC<Z, R1, E1, In1, L1, Z1, Z2>(
1741
+ export function zipWithConcurrent<Z, R1, E1, In1, L1, Z1, Z2>(
1742
1742
  that: Lazy<Sink<R1, E1, In1, L1, Z1>>,
1743
1743
  f: (z: Z, z1: Z1) => Z2,
1744
1744
  __tsplusTrace?: string,
@@ -1,4 +1,4 @@
1
- import type { Emitter } from "@fncts/io/Push/definition";
1
+ import type { Sink } from "@fncts/io/Push/definition";
2
2
  import type { Subject } from "@fncts/io/Subject/definition";
3
3
 
4
4
  import { Multicast, Push } from "@fncts/io/Push";
@@ -16,17 +16,15 @@ export class AtomicSubject<E, A> implements Subject<never, E, A> {
16
16
 
17
17
  readonly stream = new Multicast<never, E, A>(Push.never);
18
18
 
19
- run<R>(emitter: Emitter<R, E, A>): IO<R | Scope, never, unknown> {
19
+ run<R>(emitter: Sink<R, E, A>): IO<R, never, unknown> {
20
20
  return this.stream.run(emitter);
21
21
  }
22
22
 
23
- emit(value: A): IO<never, never, void> {
24
- return this.stream.emit(value);
23
+ event(value: A): IO<never, never, void> {
24
+ return this.stream.event(value);
25
25
  }
26
26
 
27
- failCause(cause: Cause<E>): IO<never, never, void> {
28
- return this.stream.failCause(cause);
27
+ error(cause: Cause<E>): IO<never, never, void> {
28
+ return this.stream.error(cause);
29
29
  }
30
-
31
- end = this.stream.end;
32
30
  }
@@ -1,4 +1,4 @@
1
- import type { Emitter, Push } from "../Push.js";
1
+ import type { Push,Sink } from "../Push.js";
2
2
 
3
3
  export const SubjectTypeId = Symbol.for("fncts.io.Push.Subject");
4
4
  export type SubjectTypeId = typeof SubjectTypeId;
@@ -6,7 +6,7 @@ export type SubjectTypeId = typeof SubjectTypeId;
6
6
  /**
7
7
  * @tsplus type fncts.io.Push.Subject
8
8
  */
9
- export interface Subject<R, E, A> extends Push<R, E, A>, Emitter<R, E, A> {
9
+ export interface Subject<R, E, A> extends Push<R, E, A>, Sink<R, E, A> {
10
10
  readonly [SubjectTypeId]: SubjectTypeId;
11
11
  }
12
12
 
@@ -3,20 +3,23 @@
3
3
  */
4
4
  export function dropUntilIO<A, R, E>(p: (a: A) => IO<R, E, boolean>, __tsplusTrace?: string) {
5
5
  return (self: Conc<A>): IO<R, E, Conc<A>> => {
6
- return IO.defer(() => {
7
- const builder = new ConcBuilder<A>();
8
- let dropping: IO<R, E, boolean> = IO.succeedNow(false);
9
- for (const elem of self) {
10
- dropping = dropping.flatMap((b) => {
11
- if (b) {
12
- builder.append(elem);
13
- return IO.succeedNow(true);
14
- } else {
15
- return p(elem);
16
- }
17
- });
18
- }
19
- return dropping.as(builder.result());
20
- });
6
+ return IO.defer(dropUntilIOLoop(self, self[Symbol.iterator](), p, 0));
21
7
  };
22
8
  }
9
+
10
+ function dropUntilIOLoop<A, R, E>(
11
+ self: Conc<A>,
12
+ iterator: Iterator<A>,
13
+ p: (a: A) => IO<R, E, boolean>,
14
+ index: number,
15
+ __tsplusTrace?: string,
16
+ ): IO<R, E, Conc<A>> {
17
+ let result: IteratorResult<A>;
18
+ if (!(result = iterator.next()).done) {
19
+ return p(result.value).flatMap((b) =>
20
+ b ? IO.succeed(self.drop(index + 1)) : dropUntilIOLoop(self, iterator, p, index + 1),
21
+ );
22
+ } else {
23
+ return IO.succeed(Conc.empty());
24
+ }
25
+ }
@@ -3,22 +3,23 @@
3
3
  */
4
4
  export function dropWhileIO<A, R, E>(p: (a: A) => IO<R, E, boolean>, __tsplusTrace?: string) {
5
5
  return (self: Conc<A>): IO<R, E, Conc<A>> => {
6
- return IO.defer(() => {
7
- const builder = new ConcBuilder<A>();
8
- let dropping: IO<R, E, boolean> = IO.succeedNow(true);
9
- for (const elem of self) {
10
- dropping = dropping.flatMap((d) =>
11
- (d ? p(elem) : IO.succeedNow(false)).map((b) => {
12
- if (b) {
13
- return true;
14
- } else {
15
- builder.append(elem);
16
- return false;
17
- }
18
- }),
19
- );
20
- }
21
- return dropping.as(builder.result());
22
- });
6
+ return IO.defer(dropWhileIOLoop(self, self[Symbol.iterator](), p, 0));
23
7
  };
24
8
  }
9
+
10
+ function dropWhileIOLoop<A, R, E>(
11
+ self: Conc<A>,
12
+ iterator: Iterator<A>,
13
+ p: (a: A) => IO<R, E, boolean>,
14
+ index: number,
15
+ __tsplusTrace?: string,
16
+ ): IO<R, E, Conc<A>> {
17
+ let result: IteratorResult<A>;
18
+ if (!(result = iterator.next()).done) {
19
+ return p(result.value).flatMap((b) =>
20
+ b ? dropWhileIOLoop(self, iterator, p, index + 1) : IO.succeed(self.drop(index)),
21
+ );
22
+ } else {
23
+ return IO.succeed(Conc.empty());
24
+ }
25
+ }
@@ -3,16 +3,6 @@
3
3
  */
4
4
  export function filterIO<A, R, E>(p: (a: A) => IO<R, E, boolean>, __tsplusTrace?: string) {
5
5
  return (self: Conc<A>): IO<R, E, Conc<A>> => {
6
- return IO.defer(() => {
7
- const builder = new ConcBuilder<A>();
8
- let dest: IO<R, E, ConcBuilder<A>> = IO.succeedNow(builder);
9
- for (const a of self) {
10
- dest = dest.zipWith(p(a), (builder, res) => {
11
- if (res) return builder.append(a);
12
- else return builder;
13
- });
14
- }
15
- return dest.map((builder) => builder.result());
16
- });
6
+ return IO.filter(self, p);
17
7
  };
18
8
  }
@@ -2,14 +2,7 @@
2
2
  * @tsplus pipeable fncts.Conc mapIO
3
3
  */
4
4
  export function mapIO<A, R, E, B>(f: (a: A) => IO<R, E, B>, __tsplusTrace?: string) {
5
- return (as: Conc<A>): IO<R, E, Conc<B>> => {
6
- return IO.defer(() => {
7
- const out = Conc.builder<B>();
8
- return IO.foreachDiscard(as, (a) =>
9
- f(a).map((b) => {
10
- out.append(b);
11
- }),
12
- ).as(out.result());
13
- });
5
+ return (self: Conc<A>): IO<R, E, Conc<B>> => {
6
+ return IO.foreach(self, f);
14
7
  };
15
8
  }