@fncts/io 0.0.32 → 0.0.33

Sign up to get free protection for your applications and to get access to all the features.
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
  },