@fncts/io 0.0.32 → 0.0.33

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 (275) hide show
  1. package/Fiber/FiberRuntime.d.ts +3 -3
  2. package/IO/api.d.ts +2 -1
  3. package/IO/definition.d.ts +34 -24
  4. package/IO/runtime.d.ts +7 -17
  5. package/STM/definition.d.ts +1 -1
  6. package/Stream/api.d.ts +89 -1
  7. package/_cjs/Channel/api/mapOutConcurrentIO.cjs +1 -1
  8. package/_cjs/Channel/api/mapOutConcurrentIO.cjs.map +1 -1
  9. package/_cjs/Channel/api/mergeAllWith.cjs +3 -3
  10. package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
  11. package/_cjs/Channel/api/mergeWith.cjs +4 -4
  12. package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
  13. package/_cjs/Channel/api/toPull.cjs +2 -2
  14. package/_cjs/Channel/api/toPull.cjs.map +1 -1
  15. package/_cjs/Channel/api.cjs +6 -6
  16. package/_cjs/Channel/api.cjs.map +1 -1
  17. package/_cjs/Channel/internal/ChannelExecutor.cjs +10 -10
  18. package/_cjs/Channel/internal/ChannelExecutor.cjs.map +1 -1
  19. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs +3 -3
  20. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs.map +1 -1
  21. package/_cjs/Clock/live.cjs +1 -1
  22. package/_cjs/Clock/live.cjs.map +1 -1
  23. package/_cjs/Fiber/FiberRuntime.cjs +78 -47
  24. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  25. package/_cjs/Fiber/api/collectAll.cjs +1 -1
  26. package/_cjs/Fiber/api/collectAll.cjs.map +1 -1
  27. package/_cjs/Fiber/api/mapIO.cjs +1 -1
  28. package/_cjs/Fiber/api/mapIO.cjs.map +1 -1
  29. package/_cjs/Fiber/api/zipWith.cjs +1 -1
  30. package/_cjs/Fiber/api/zipWith.cjs.map +1 -1
  31. package/_cjs/Fiber/constructors.cjs +5 -5
  32. package/_cjs/Fiber/constructors.cjs.map +1 -1
  33. package/_cjs/FiberRef/unsafe.cjs +3 -2
  34. package/_cjs/FiberRef/unsafe.cjs.map +1 -1
  35. package/_cjs/Future/api.cjs +4 -4
  36. package/_cjs/Future/api.cjs.map +1 -1
  37. package/_cjs/Hub/internal.cjs +1 -1
  38. package/_cjs/Hub/internal.cjs.map +1 -1
  39. package/_cjs/IO/api/asyncIO.cjs +1 -1
  40. package/_cjs/IO/api/asyncIO.cjs.map +1 -1
  41. package/_cjs/IO/api/asyncInterrupt.cjs +2 -2
  42. package/_cjs/IO/api/asyncInterrupt.cjs.map +1 -1
  43. package/_cjs/IO/api/concurrency.cjs +3 -3
  44. package/_cjs/IO/api/concurrency.cjs.map +1 -1
  45. package/_cjs/IO/api/daemonChildren.cjs +1 -1
  46. package/_cjs/IO/api/daemonChildren.cjs.map +1 -1
  47. package/_cjs/IO/api/fork.cjs +2 -1
  48. package/_cjs/IO/api/fork.cjs.map +1 -1
  49. package/_cjs/IO/api/interrupt.cjs +2 -2
  50. package/_cjs/IO/api/interrupt.cjs.map +1 -1
  51. package/_cjs/IO/api/repeat.cjs +2 -2
  52. package/_cjs/IO/api/repeat.cjs.map +1 -1
  53. package/_cjs/IO/api/timeout.cjs +1 -1
  54. package/_cjs/IO/api/timeout.cjs.map +1 -1
  55. package/_cjs/IO/api/transplant.cjs +1 -1
  56. package/_cjs/IO/api/transplant.cjs.map +1 -1
  57. package/_cjs/IO/api/withEarlyRelease.cjs +1 -1
  58. package/_cjs/IO/api/withEarlyRelease.cjs.map +1 -1
  59. package/_cjs/IO/api.cjs +33 -32
  60. package/_cjs/IO/api.cjs.map +1 -1
  61. package/_cjs/IO/definition.cjs +17 -31
  62. package/_cjs/IO/definition.cjs.map +1 -1
  63. package/_cjs/IO/runtime.cjs +45 -38
  64. package/_cjs/IO/runtime.cjs.map +1 -1
  65. package/_cjs/Logger/api.cjs +3 -2
  66. package/_cjs/Logger/api.cjs.map +1 -1
  67. package/_cjs/MVar/api.cjs +11 -11
  68. package/_cjs/MVar/api.cjs.map +1 -1
  69. package/_cjs/Push/api.cjs +3 -3
  70. package/_cjs/Push/api.cjs.map +1 -1
  71. package/_cjs/Push/internal.cjs +1 -1
  72. package/_cjs/Push/internal.cjs.map +1 -1
  73. package/_cjs/Queue/api/filterInputIO.cjs +2 -2
  74. package/_cjs/Queue/api/filterInputIO.cjs.map +1 -1
  75. package/_cjs/Ref/Derived.cjs +4 -4
  76. package/_cjs/Ref/Derived.cjs.map +1 -1
  77. package/_cjs/Ref/DerivedAll.cjs +5 -5
  78. package/_cjs/Ref/DerivedAll.cjs.map +1 -1
  79. package/_cjs/Ref/Synchronized/api.cjs +3 -3
  80. package/_cjs/Ref/Synchronized/api.cjs.map +1 -1
  81. package/_cjs/Ref/api/collect.cjs +1 -1
  82. package/_cjs/Ref/api/collect.cjs.map +1 -1
  83. package/_cjs/Ref/api/dimap.cjs +3 -3
  84. package/_cjs/Ref/api/dimap.cjs.map +1 -1
  85. package/_cjs/Ref/api/filter.cjs +2 -2
  86. package/_cjs/Ref/api/filter.cjs.map +1 -1
  87. package/_cjs/Ref/api.cjs +2 -3
  88. package/_cjs/Ref/api.cjs.map +1 -1
  89. package/_cjs/RefSubject/Atomic.cjs +6 -6
  90. package/_cjs/RefSubject/Atomic.cjs.map +1 -1
  91. package/_cjs/STM/api.cjs +5 -5
  92. package/_cjs/STM/api.cjs.map +1 -1
  93. package/_cjs/STM/definition.cjs +1 -1
  94. package/_cjs/STM/definition.cjs.map +1 -1
  95. package/_cjs/STM/internal/CommitState.cjs +5 -4
  96. package/_cjs/STM/internal/CommitState.cjs.map +1 -1
  97. package/_cjs/STM/internal/Journal.cjs +8 -8
  98. package/_cjs/STM/internal/Journal.cjs.map +1 -1
  99. package/_cjs/Schedule/api/driver.cjs +3 -3
  100. package/_cjs/Schedule/api/driver.cjs.map +1 -1
  101. package/_cjs/Schedule/api.cjs +8 -8
  102. package/_cjs/Schedule/api.cjs.map +1 -1
  103. package/_cjs/Scope/ReleaseMap/api/releaseAll.cjs +1 -1
  104. package/_cjs/Scope/ReleaseMap/api/releaseAll.cjs.map +1 -1
  105. package/_cjs/Scope/ReleaseMap/api.cjs +3 -3
  106. package/_cjs/Scope/ReleaseMap/api.cjs.map +1 -1
  107. package/_cjs/ScopedRef/api.cjs +1 -1
  108. package/_cjs/ScopedRef/api.cjs.map +1 -1
  109. package/_cjs/Semaphore.cjs +2 -2
  110. package/_cjs/Semaphore.cjs.map +1 -1
  111. package/_cjs/Sink/api.cjs +6 -6
  112. package/_cjs/Sink/api.cjs.map +1 -1
  113. package/_cjs/Stream/api/zipAllWith.cjs +8 -8
  114. package/_cjs/Stream/api/zipAllWith.cjs.map +1 -1
  115. package/_cjs/Stream/api/zipWithChunks.cjs +6 -6
  116. package/_cjs/Stream/api/zipWithChunks.cjs.map +1 -1
  117. package/_cjs/Stream/api.cjs +370 -130
  118. package/_cjs/Stream/api.cjs.map +1 -1
  119. package/_cjs/Stream/internal/Handoff.cjs +2 -2
  120. package/_cjs/Stream/internal/Handoff.cjs.map +1 -1
  121. package/_cjs/Stream/internal/Pull.cjs +2 -2
  122. package/_cjs/Stream/internal/Pull.cjs.map +1 -1
  123. package/_cjs/Stream/internal/Take.cjs +6 -6
  124. package/_cjs/Stream/internal/Take.cjs.map +1 -1
  125. package/_cjs/Stream/internal/util.cjs +3 -2
  126. package/_cjs/Stream/internal/util.cjs.map +1 -1
  127. package/_cjs/TFuture/api.cjs +3 -3
  128. package/_cjs/TFuture/api.cjs.map +1 -1
  129. package/_cjs/TFuture/constructors.cjs +1 -1
  130. package/_cjs/TFuture/constructors.cjs.map +1 -1
  131. package/_cjs/TRef/definition.cjs +9 -9
  132. package/_cjs/TRef/definition.cjs.map +1 -1
  133. package/_cjs/collection/immutable/Conc/findIO.cjs +3 -3
  134. package/_cjs/collection/immutable/Conc/findIO.cjs.map +1 -1
  135. package/_cjs/data/Exit/foreachIO.cjs +1 -1
  136. package/_cjs/data/Exit/foreachIO.cjs.map +1 -1
  137. package/_mjs/Channel/api/mapOutConcurrentIO.mjs +1 -1
  138. package/_mjs/Channel/api/mapOutConcurrentIO.mjs.map +1 -1
  139. package/_mjs/Channel/api/mergeAllWith.mjs +3 -3
  140. package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
  141. package/_mjs/Channel/api/mergeWith.mjs +4 -4
  142. package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
  143. package/_mjs/Channel/api/toPull.mjs +2 -2
  144. package/_mjs/Channel/api/toPull.mjs.map +1 -1
  145. package/_mjs/Channel/api.mjs +6 -6
  146. package/_mjs/Channel/api.mjs.map +1 -1
  147. package/_mjs/Channel/internal/ChannelExecutor.mjs +10 -10
  148. package/_mjs/Channel/internal/ChannelExecutor.mjs.map +1 -1
  149. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs +3 -3
  150. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs.map +1 -1
  151. package/_mjs/Clock/live.mjs +1 -1
  152. package/_mjs/Clock/live.mjs.map +1 -1
  153. package/_mjs/Fiber/FiberRuntime.mjs +78 -47
  154. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  155. package/_mjs/Fiber/api/collectAll.mjs +1 -1
  156. package/_mjs/Fiber/api/collectAll.mjs.map +1 -1
  157. package/_mjs/Fiber/api/mapIO.mjs +1 -1
  158. package/_mjs/Fiber/api/mapIO.mjs.map +1 -1
  159. package/_mjs/Fiber/api/zipWith.mjs +1 -1
  160. package/_mjs/Fiber/api/zipWith.mjs.map +1 -1
  161. package/_mjs/Fiber/constructors.mjs +5 -5
  162. package/_mjs/Fiber/constructors.mjs.map +1 -1
  163. package/_mjs/FiberRef/unsafe.mjs +3 -2
  164. package/_mjs/FiberRef/unsafe.mjs.map +1 -1
  165. package/_mjs/Future/api.mjs +4 -4
  166. package/_mjs/Future/api.mjs.map +1 -1
  167. package/_mjs/Hub/internal.mjs +1 -1
  168. package/_mjs/Hub/internal.mjs.map +1 -1
  169. package/_mjs/IO/api/asyncIO.mjs +1 -1
  170. package/_mjs/IO/api/asyncIO.mjs.map +1 -1
  171. package/_mjs/IO/api/asyncInterrupt.mjs +2 -2
  172. package/_mjs/IO/api/asyncInterrupt.mjs.map +1 -1
  173. package/_mjs/IO/api/concurrency.mjs +3 -3
  174. package/_mjs/IO/api/concurrency.mjs.map +1 -1
  175. package/_mjs/IO/api/daemonChildren.mjs +1 -1
  176. package/_mjs/IO/api/daemonChildren.mjs.map +1 -1
  177. package/_mjs/IO/api/fork.mjs +2 -1
  178. package/_mjs/IO/api/fork.mjs.map +1 -1
  179. package/_mjs/IO/api/interrupt.mjs +2 -2
  180. package/_mjs/IO/api/interrupt.mjs.map +1 -1
  181. package/_mjs/IO/api/repeat.mjs +2 -2
  182. package/_mjs/IO/api/repeat.mjs.map +1 -1
  183. package/_mjs/IO/api/timeout.mjs +1 -1
  184. package/_mjs/IO/api/timeout.mjs.map +1 -1
  185. package/_mjs/IO/api/transplant.mjs +1 -1
  186. package/_mjs/IO/api/transplant.mjs.map +1 -1
  187. package/_mjs/IO/api/withEarlyRelease.mjs +1 -1
  188. package/_mjs/IO/api/withEarlyRelease.mjs.map +1 -1
  189. package/_mjs/IO/api.mjs +32 -30
  190. package/_mjs/IO/api.mjs.map +1 -1
  191. package/_mjs/IO/definition.mjs +16 -27
  192. package/_mjs/IO/definition.mjs.map +1 -1
  193. package/_mjs/IO/runtime.mjs +42 -33
  194. package/_mjs/IO/runtime.mjs.map +1 -1
  195. package/_mjs/Logger/api.mjs +3 -2
  196. package/_mjs/Logger/api.mjs.map +1 -1
  197. package/_mjs/MVar/api.mjs +11 -11
  198. package/_mjs/MVar/api.mjs.map +1 -1
  199. package/_mjs/Push/api.mjs +3 -3
  200. package/_mjs/Push/api.mjs.map +1 -1
  201. package/_mjs/Push/internal.mjs +1 -1
  202. package/_mjs/Push/internal.mjs.map +1 -1
  203. package/_mjs/Queue/api/filterInputIO.mjs +2 -2
  204. package/_mjs/Queue/api/filterInputIO.mjs.map +1 -1
  205. package/_mjs/Ref/Derived.mjs +4 -4
  206. package/_mjs/Ref/Derived.mjs.map +1 -1
  207. package/_mjs/Ref/DerivedAll.mjs +5 -5
  208. package/_mjs/Ref/DerivedAll.mjs.map +1 -1
  209. package/_mjs/Ref/Synchronized/api.mjs +3 -3
  210. package/_mjs/Ref/Synchronized/api.mjs.map +1 -1
  211. package/_mjs/Ref/api/collect.mjs +1 -1
  212. package/_mjs/Ref/api/collect.mjs.map +1 -1
  213. package/_mjs/Ref/api/dimap.mjs +3 -3
  214. package/_mjs/Ref/api/dimap.mjs.map +1 -1
  215. package/_mjs/Ref/api/filter.mjs +2 -2
  216. package/_mjs/Ref/api/filter.mjs.map +1 -1
  217. package/_mjs/Ref/api.mjs +2 -1
  218. package/_mjs/Ref/api.mjs.map +1 -1
  219. package/_mjs/RefSubject/Atomic.mjs +6 -6
  220. package/_mjs/RefSubject/Atomic.mjs.map +1 -1
  221. package/_mjs/STM/api.mjs +5 -5
  222. package/_mjs/STM/api.mjs.map +1 -1
  223. package/_mjs/STM/definition.mjs +1 -1
  224. package/_mjs/STM/definition.mjs.map +1 -1
  225. package/_mjs/STM/internal/CommitState.mjs +5 -4
  226. package/_mjs/STM/internal/CommitState.mjs.map +1 -1
  227. package/_mjs/STM/internal/Journal.mjs +8 -8
  228. package/_mjs/STM/internal/Journal.mjs.map +1 -1
  229. package/_mjs/Schedule/api/driver.mjs +3 -3
  230. package/_mjs/Schedule/api/driver.mjs.map +1 -1
  231. package/_mjs/Schedule/api.mjs +8 -8
  232. package/_mjs/Schedule/api.mjs.map +1 -1
  233. package/_mjs/Scope/ReleaseMap/api/releaseAll.mjs +1 -1
  234. package/_mjs/Scope/ReleaseMap/api/releaseAll.mjs.map +1 -1
  235. package/_mjs/Scope/ReleaseMap/api.mjs +3 -3
  236. package/_mjs/Scope/ReleaseMap/api.mjs.map +1 -1
  237. package/_mjs/ScopedRef/api.mjs +1 -1
  238. package/_mjs/ScopedRef/api.mjs.map +1 -1
  239. package/_mjs/Semaphore.mjs +2 -2
  240. package/_mjs/Semaphore.mjs.map +1 -1
  241. package/_mjs/Sink/api.mjs +6 -6
  242. package/_mjs/Sink/api.mjs.map +1 -1
  243. package/_mjs/Stream/api/zipAllWith.mjs +8 -8
  244. package/_mjs/Stream/api/zipAllWith.mjs.map +1 -1
  245. package/_mjs/Stream/api/zipWithChunks.mjs +6 -6
  246. package/_mjs/Stream/api/zipWithChunks.mjs.map +1 -1
  247. package/_mjs/Stream/api.mjs +281 -58
  248. package/_mjs/Stream/api.mjs.map +1 -1
  249. package/_mjs/Stream/internal/Handoff.mjs +2 -2
  250. package/_mjs/Stream/internal/Handoff.mjs.map +1 -1
  251. package/_mjs/Stream/internal/Pull.mjs +2 -2
  252. package/_mjs/Stream/internal/Pull.mjs.map +1 -1
  253. package/_mjs/Stream/internal/Take.mjs +6 -6
  254. package/_mjs/Stream/internal/Take.mjs.map +1 -1
  255. package/_mjs/Stream/internal/util.mjs +3 -2
  256. package/_mjs/Stream/internal/util.mjs.map +1 -1
  257. package/_mjs/TFuture/api.mjs +3 -3
  258. package/_mjs/TFuture/api.mjs.map +1 -1
  259. package/_mjs/TFuture/constructors.mjs +1 -1
  260. package/_mjs/TFuture/constructors.mjs.map +1 -1
  261. package/_mjs/TRef/definition.mjs +9 -9
  262. package/_mjs/TRef/definition.mjs.map +1 -1
  263. package/_mjs/collection/immutable/Conc/findIO.mjs +3 -3
  264. package/_mjs/collection/immutable/Conc/findIO.mjs.map +1 -1
  265. package/_mjs/data/Exit/foreachIO.mjs +1 -1
  266. package/_mjs/data/Exit/foreachIO.mjs.map +1 -1
  267. package/_src/Fiber/FiberRuntime.ts +39 -16
  268. package/_src/IO/api/asyncIO.ts +1 -1
  269. package/_src/IO/api.ts +4 -3
  270. package/_src/IO/definition.ts +35 -28
  271. package/_src/IO/runtime.ts +36 -35
  272. package/_src/RefSubject/Atomic.ts +4 -4
  273. package/_src/STM/definition.ts +1 -1
  274. package/_src/Stream/api.ts +258 -8
  275. package/package.json +2 -2
@@ -53,15 +53,15 @@ export class AtomicRefSubject<E, A> extends RefSubjectInternal<never, E, A, A> {
53
53
  end: IO<never, never, void> = this.stream.end;
54
54
 
55
55
  unsafeEmit(value: A): void {
56
- return this.stream.emit(value).unsafeRunAsync();
56
+ this.stream.emit(value).unsafeRunFiber();
57
57
  }
58
58
 
59
59
  unsafeFailCause(cause: Cause<E>): void {
60
- return this.stream.failCause(cause).unsafeRunAsync();
60
+ this.stream.failCause(cause).unsafeRunFiber();
61
61
  }
62
62
 
63
63
  unsafeEnd(): void {
64
- return this.stream.end.unsafeRunAsync();
64
+ this.stream.end.unsafeRunFiber();
65
65
  }
66
66
 
67
67
  get unsafeGet(): A {
@@ -111,7 +111,7 @@ class AtomicEmitRef<E, A> extends Atomic<A> {
111
111
 
112
112
  unsafeSet(value: A) {
113
113
  this.ref.unsafeSet(value);
114
- this.emitter.emit(value).unsafeRunAsync();
114
+ this.emitter.emit(value).unsafeRunFiber();
115
115
  }
116
116
 
117
117
  set(value: A, __tsplusTrace?: string) {
@@ -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 ioOpCode = IOOpCode.Commit;
28
+ readonly _tag = IOOpCode.Commit;
29
29
  readonly trace?: string;
30
30
  readonly [STMTypeId]: STMTypeId = STMTypeId;
31
31
  declare [IOVariance]: {
@@ -247,7 +247,11 @@ export function asyncInterrupt<R, E, A>(
247
247
  IO.succeed(() =>
248
248
  register((k, cb) => {
249
249
  const effect = Take.fromPull(k).flatMap((a) => output.offer(a));
250
- return runtime.unsafeRunAsyncWith(effect, cb || constVoid);
250
+ const fiber = runtime.makeFiber(effect);
251
+ if (cb) {
252
+ fiber.addObserver(cb);
253
+ }
254
+ fiber.start(effect);
251
255
  }),
252
256
  ),
253
257
  );
@@ -317,12 +321,14 @@ export function asyncIO<R, E, A, R1 = R, E1 = E>(
317
321
  const output = Δ(IO.acquireRelease(Queue.makeBounded<Take<E, A>>(outputBuffer), (_) => _.shutdown));
318
322
  const runtime = Δ(IO.runtime<R>());
319
323
  Δ(
320
- register((k, cb) =>
321
- runtime.unsafeRunAsyncWith(
322
- Take.fromPull(k).flatMap((a) => output.offer(a)),
323
- cb || constVoid,
324
- ),
325
- ),
324
+ register((k, cb) => {
325
+ const io = Take.fromPull(k).flatMap((a) => output.offer(a));
326
+ const fiber = runtime.makeFiber(io);
327
+ if (cb) {
328
+ fiber.addObserver(cb);
329
+ }
330
+ fiber.start(io);
331
+ }),
326
332
  );
327
333
  const loop: Channel<never, unknown, unknown, unknown, E, Conc<A>, void> = Channel.unwrap(
328
334
  output.take
@@ -1157,7 +1163,7 @@ export function distributedWithDynamic<E, A>(
1157
1163
  *
1158
1164
  * @tsplus getter fncts.io.Stream drain
1159
1165
  */
1160
- export function drain<R, E, A>(fa: Stream<R, E, A>, __tsplusTrace?: string): Stream<R, E, void> {
1166
+ export function drain<R, E, A>(fa: Stream<R, E, A>, __tsplusTrace?: string): Stream<R, E, never> {
1161
1167
  return new Stream(fa.channel.drain);
1162
1168
  }
1163
1169
 
@@ -1312,6 +1318,15 @@ export function environmentWithStream<R0, R, E, A>(
1312
1318
  return Stream.environment<R0>().flatMap(f);
1313
1319
  }
1314
1320
 
1321
+ /**
1322
+ * Creates a stream that executes the specified effect but emits no elements.
1323
+ *
1324
+ * @tsplus static fncts.io.StreamOps execute
1325
+ */
1326
+ export function execute<R, E>(io: IO<R, E, any>, __tsplusTrace?: string): Stream<R, E, never> {
1327
+ return Stream.fromIO(io).drain;
1328
+ }
1329
+
1315
1330
  /**
1316
1331
  * Halt a stream with the specified error
1317
1332
  *
@@ -1584,6 +1599,65 @@ export function scoped<R, E, A>(stream: Lazy<IO<R, E, A>>, __tsplusTrace?: strin
1584
1599
  return new Stream(Channel.scoped(stream().map(Conc.single)));
1585
1600
  }
1586
1601
 
1602
+ /**
1603
+ * Emits a sliding window of n elements.
1604
+ *
1605
+ * @tsplus pipeable fncts.io.Stream sliding
1606
+ */
1607
+ export function sliding(chunkSize: number, stepSize: number, __tsplusTrace?: string) {
1608
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R, E, Conc<A>> => {
1609
+ return Stream.defer(() => {
1610
+ function slidingChunk(chunk: Conc<A>, input: Conc<A>): [Conc<A>, Conc<Conc<A>>] {
1611
+ const updatedChunk = chunk.concat(input);
1612
+ const length = updatedChunk.length;
1613
+ if (length >= chunkSize) {
1614
+ const array = new Array<Conc<A>>((length - chunkSize) / stepSize + 1);
1615
+ let arrayIndex = 0;
1616
+ let chunkIndex = 0;
1617
+ while (chunkIndex + chunkSize <= length) {
1618
+ array[arrayIndex] = updatedChunk.slice(chunkIndex, chunkIndex + chunkSize);
1619
+ arrayIndex += 1;
1620
+ chunkIndex += stepSize;
1621
+ }
1622
+ return [updatedChunk.drop(chunkIndex), Conc.fromArray(array)];
1623
+ } else {
1624
+ return [updatedChunk, Conc.empty()];
1625
+ }
1626
+ }
1627
+ function sliding(chunk: Conc<A>, written: boolean): Channel<never, E, Conc<A>, any, E, Conc<Conc<A>>, any> {
1628
+ return Channel.readWithCause(
1629
+ (input) => {
1630
+ const [updatedChunk, out] = slidingChunk(chunk, input);
1631
+ if (out.isEmpty) {
1632
+ return sliding(updatedChunk, written);
1633
+ } else {
1634
+ return Channel.writeNow(out) > sliding(updatedChunk, true);
1635
+ }
1636
+ },
1637
+ (err) => {
1638
+ const index = written && chunkSize > stepSize ? chunkSize - stepSize : 0;
1639
+ if (index >= chunk.length) {
1640
+ return Channel.failCauseNow(err);
1641
+ } else {
1642
+ return Channel.writeNow(Conc.single(chunk)) > Channel.failCauseNow(err);
1643
+ }
1644
+ },
1645
+ (done) => {
1646
+ const index = written && chunkSize > stepSize ? chunkSize - stepSize : 0;
1647
+ if (index >= chunk.length) {
1648
+ return Channel.succeedNow(done);
1649
+ } else {
1650
+ return Channel.writeNow(Conc.single(chunk)) > Channel.succeedNow(done);
1651
+ }
1652
+ },
1653
+ );
1654
+ }
1655
+
1656
+ return new Stream(self.channel >>> sliding(Conc.empty(), false));
1657
+ });
1658
+ };
1659
+ }
1660
+
1587
1661
  /**
1588
1662
  * Creates a stream from an effect producing a value of type `A`
1589
1663
  *
@@ -2218,6 +2292,84 @@ export function mapIOConcurrentlyUnordered<A, R1, E1, B>(n: number, f: (a: A) =>
2218
2292
  };
2219
2293
  }
2220
2294
 
2295
+ /**
2296
+ * Merges this stream and the specified stream together.
2297
+ *
2298
+ * New produced stream will terminate when both specified stream terminate if
2299
+ * no termination strategy is specified.
2300
+ *
2301
+ * @tsplus pipeable fncts.io.Stream merge
2302
+ */
2303
+ export function merge<R1, E1, B>(
2304
+ that: Stream<R1, E1, B>,
2305
+ strategy: TerminationStrategy = "Both",
2306
+ __tsplusTrace?: string,
2307
+ ) {
2308
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
2309
+ return self.mergeWith(that, identity, identity, strategy);
2310
+ };
2311
+ }
2312
+
2313
+ /**
2314
+ * Merges this stream and the specified stream together. New produced stream
2315
+ * will terminate when either stream terminates.
2316
+ *
2317
+ * @tsplus pipeable fncts.io.Stream mergeHaltEither
2318
+ */
2319
+ export function mergeHaltEither<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
2320
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
2321
+ return self.merge(that, "Either");
2322
+ };
2323
+ }
2324
+
2325
+ /**
2326
+ * Merges this stream and the specified stream together. New produced stream
2327
+ * will terminate when this stream terminates.
2328
+ *
2329
+ * @tsplus pipeable fncts.io.Stream mergeHaltLeft
2330
+ */
2331
+ export function mergeHaltLeft<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
2332
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
2333
+ return self.merge(that, "Left");
2334
+ };
2335
+ }
2336
+
2337
+ /**
2338
+ * Merges this stream and the specified stream together. New produced stream
2339
+ * will terminate when the specified stream terminates.
2340
+ *
2341
+ * @tsplus pipeable fncts.io.Stream mergeHaltRight
2342
+ */
2343
+ export function mergeHaltRight<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
2344
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
2345
+ return self.merge(that, "Right");
2346
+ };
2347
+ }
2348
+
2349
+ /**
2350
+ * Merges this stream and the specified stream together, discarding the values
2351
+ * from the right stream.
2352
+ *
2353
+ * @tsplus pipeable fncts.io.Stream mergeLeft
2354
+ */
2355
+ export function mergeLeft<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
2356
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
2357
+ return self.merge(that.drain);
2358
+ };
2359
+ }
2360
+
2361
+ /**
2362
+ * Merges this stream and the specified stream together, discarding the values
2363
+ * from the left stream.
2364
+ *
2365
+ * @tsplus pipeable fncts.io.Stream mergeRight
2366
+ */
2367
+ export function mergeRight<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
2368
+ return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, B> => {
2369
+ return self.drain.merge(that);
2370
+ };
2371
+ }
2372
+
2221
2373
  /**
2222
2374
  * Maps each element of this stream to another stream and returns the
2223
2375
  * non-deterministic merge of those streams, executing up to `n` inner streams
@@ -2733,6 +2885,40 @@ export function scanReduceIO<A extends B, R1, E1, B>(f: (b: B, a: A) => IO<R1, E
2733
2885
  };
2734
2886
  }
2735
2887
 
2888
+ /**
2889
+ * @tsplus pipeable fncts.io.Stream split
2890
+ */
2891
+ export function split<A>(predicate: Predicate<A>, __tsplusTrace?: string) {
2892
+ return <R, E>(self: Stream<R, E, A>): Stream<R, E, Conc<A>> => {
2893
+ function split(leftovers: Conc<A>, input: Conc<A>): Channel<R, E, Conc<A>, any, E, Conc<Conc<A>>, any> {
2894
+ const [chunk, remaining] = leftovers.concat(input).splitWhere(predicate);
2895
+ if (chunk.isEmpty || remaining.isEmpty) {
2896
+ return loop(chunk.concat(remaining.drop(1)));
2897
+ } else {
2898
+ return Channel.writeNow(Conc.single(chunk)) > split(Conc.empty(), remaining.drop(1));
2899
+ }
2900
+ }
2901
+
2902
+ function loop(leftovers: Conc<A>): Channel<R, E, Conc<A>, any, E, Conc<Conc<A>>, any> {
2903
+ return Channel.readWith(
2904
+ (input) => split(leftovers, input),
2905
+ Channel.failNow,
2906
+ (_) => {
2907
+ if (leftovers.isEmpty) {
2908
+ return Channel.unit;
2909
+ } else if (leftovers.find(predicate).isNothing()) {
2910
+ return Channel.writeNow(Conc.single(leftovers)) > Channel.unit;
2911
+ } else {
2912
+ return split(Conc.empty(), leftovers) > Channel.unit;
2913
+ }
2914
+ },
2915
+ );
2916
+ }
2917
+
2918
+ return new Stream(self.channel >>> loop(Conc.empty()));
2919
+ };
2920
+ }
2921
+
2736
2922
  /**
2737
2923
  * Creates a single-valued pure stream
2738
2924
  *
@@ -2856,6 +3042,70 @@ export function tap<A, R1, E1>(f: (a: A) => IO<R1, E1, any>, __tsplusTrace?: str
2856
3042
  };
2857
3043
  }
2858
3044
 
3045
+ /**
3046
+ * Returns a stream that effectfully "peeks" at the failure and adds an effect
3047
+ * to consumption of every element of the stream
3048
+ *
3049
+ * @tsplus pipeable fncts.io.Stream tapBoth
3050
+ */
3051
+ export function tapBoth<E, A, R1, E1, R2, E2>(
3052
+ f: (e: E) => IO<R1, E1, any>,
3053
+ g: (a: A) => IO<R2, E2, any>,
3054
+ __tsplusTrace?: string,
3055
+ ) {
3056
+ return <R>(self: Stream<R, E, A>): Stream<R | R1 | R2, E | E1 | E2, A> => {
3057
+ return self.tapError(f).tap(g);
3058
+ };
3059
+ }
3060
+
3061
+ /**
3062
+ * Returns a stream that effectfully "peeks" at the failure of the stream.
3063
+ *
3064
+ * @tsplus pipeable fncts.io.Stream tapError
3065
+ */
3066
+ export function tapError<E, R1, E1>(f: (e: E) => IO<R1, E1, any>, __tsplusTrace?: string) {
3067
+ return <R, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
3068
+ return self.catchAll((e) => Stream.fromIO(f(e)));
3069
+ };
3070
+ }
3071
+
3072
+ /**
3073
+ * Returns a stream that effectfully "peeks" at the cause of failure of the
3074
+ * stream.
3075
+ *
3076
+ * @tsplus pipeable fncts.io.Stream tapErrorCause
3077
+ */
3078
+ export function tapErrorCause<E, R1, E1>(f: (cause: Cause<E>) => IO<R1, E1, any>, __tsplusTrace?: string) {
3079
+ return <R, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
3080
+ return self.catchAllCause((e) => Stream.fromIO(f(e) > IO.refailCause(e)));
3081
+ };
3082
+ }
3083
+
3084
+ /**
3085
+ * Sends all elements emitted by this stream to the specified sink in addition
3086
+ * to emitting them.
3087
+ *
3088
+ * @tsplus pipeable fncts.io.Stream tapSink
3089
+ */
3090
+ export function tapSink<A, R1, E1>(sink: Sink<R1, E1, A, any, any>, __tsplusTrace?: string) {
3091
+ return <R, E>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
3092
+ return Stream.fromIO(Queue.makeBounded<Take<E | E1, A>>(1).zip(Future.make<never, void>())).flatMap(
3093
+ ([queue, future]) => {
3094
+ const right = Stream.fromQueue(queue, 1).flattenTake;
3095
+ const loop: Channel<R | R1, E, Conc<A>, any, E1, Conc<A>, any> = Channel.readWithCause(
3096
+ (chunk: Conc<A>) => Channel.fromIO(queue.offer(Take.chunk(chunk))) > Channel.writeNow(chunk) > loop,
3097
+ (cause: Cause<E>) => Channel.fromIO(queue.offer(Take.failCause(cause))),
3098
+ () => Channel.fromIO(queue.offer(Take.end)),
3099
+ );
3100
+ return new Stream((self.channel >>> loop).ensuring(queue.offer(Take.end).forkDaemon > future.await)).merge(
3101
+ Stream.execute(right.run(sink).ensuring(future.succeed(undefined))),
3102
+ "Both",
3103
+ );
3104
+ },
3105
+ );
3106
+ };
3107
+ }
3108
+
2859
3109
  /**
2860
3110
  * Throttles the chunks of this stream according to the given bandwidth parameters using the token bucket
2861
3111
  * algorithm. Allows for burst in the processing of elements by allowing the token bucket to accumulate
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@fncts/io",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
4
4
  "dependencies": {
5
- "@fncts/base": "0.0.27",
5
+ "@fncts/base": "0.0.28",
6
6
  "@fncts/transformers": "0.0.5",
7
7
  "@fncts/typelevel": "0.0.15"
8
8
  },