@fncts/io 0.0.34 → 0.0.35

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. package/Fiber/FiberRuntime.d.ts +7 -7
  2. package/IO/api/all.d.ts +41 -0
  3. package/IO/api/concurrency.d.ts +11 -0
  4. package/IO/api/interrupt.d.ts +1 -1
  5. package/IO/api/raceWith.d.ts +2 -1
  6. package/IO/api.d.ts +7 -2
  7. package/IO/definition.d.ts +103 -127
  8. package/IO.d.ts +1 -0
  9. package/Push/api.d.ts +25 -4
  10. package/Push/definition.d.ts +17 -0
  11. package/STM/definition.d.ts +2 -2
  12. package/Sink/api.d.ts +19 -19
  13. package/_cjs/Channel/api/runScoped.cjs +1 -1
  14. package/_cjs/Channel/api/runScoped.cjs.map +1 -1
  15. package/_cjs/Channel/api.cjs +2 -2
  16. package/_cjs/Channel/api.cjs.map +1 -1
  17. package/_cjs/Fiber/FiberRuntime.cjs +110 -98
  18. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  19. package/_cjs/Future/api.cjs +1 -1
  20. package/_cjs/Future/api.cjs.map +1 -1
  21. package/_cjs/IO/api/all.cjs +33 -0
  22. package/_cjs/IO/api/all.cjs.map +1 -0
  23. package/_cjs/IO/api/asyncIO.cjs +1 -1
  24. package/_cjs/IO/api/asyncIO.cjs.map +1 -1
  25. package/_cjs/IO/api/bracketExit.cjs +1 -1
  26. package/_cjs/IO/api/bracketExit.cjs.map +1 -1
  27. package/_cjs/IO/api/concurrency.cjs +25 -4
  28. package/_cjs/IO/api/concurrency.cjs.map +1 -1
  29. package/_cjs/IO/api/disconnect.cjs +1 -1
  30. package/_cjs/IO/api/disconnect.cjs.map +1 -1
  31. package/_cjs/IO/api/foreachConcurrent.cjs +1 -1
  32. package/_cjs/IO/api/foreachConcurrent.cjs.map +1 -1
  33. package/_cjs/IO/api/foreachExec.cjs +1 -1
  34. package/_cjs/IO/api/foreachExec.cjs.map +1 -1
  35. package/_cjs/IO/api/forkIn.cjs +1 -1
  36. package/_cjs/IO/api/forkIn.cjs.map +1 -1
  37. package/_cjs/IO/api/forkScoped.cjs +1 -1
  38. package/_cjs/IO/api/forkScoped.cjs.map +1 -1
  39. package/_cjs/IO/api/fulfill.cjs +1 -1
  40. package/_cjs/IO/api/fulfill.cjs.map +1 -1
  41. package/_cjs/IO/api/interrupt.cjs +18 -6
  42. package/_cjs/IO/api/interrupt.cjs.map +1 -1
  43. package/_cjs/IO/api/raceWith.cjs +4 -4
  44. package/_cjs/IO/api/raceWith.cjs.map +1 -1
  45. package/_cjs/IO/api/timeout.cjs +8 -5
  46. package/_cjs/IO/api/timeout.cjs.map +1 -1
  47. package/_cjs/IO/api/zipConcurrent.cjs +1 -1
  48. package/_cjs/IO/api/zipConcurrent.cjs.map +1 -1
  49. package/_cjs/IO/api.cjs +78 -20
  50. package/_cjs/IO/api.cjs.map +1 -1
  51. package/_cjs/IO/definition.cjs +14 -191
  52. package/_cjs/IO/definition.cjs.map +1 -1
  53. package/_cjs/IO.cjs +11 -0
  54. package/_cjs/IO.cjs.map +1 -1
  55. package/_cjs/Layer/MemoMap.cjs +1 -1
  56. package/_cjs/Layer/MemoMap.cjs.map +1 -1
  57. package/_cjs/Push/api.cjs +149 -110
  58. package/_cjs/Push/api.cjs.map +1 -1
  59. package/_cjs/Push/definition.cjs.map +1 -1
  60. package/_cjs/STM/api/atomically.cjs +1 -1
  61. package/_cjs/STM/api/atomically.cjs.map +1 -1
  62. package/_cjs/STM/definition.cjs +1 -1
  63. package/_cjs/STM/definition.cjs.map +1 -1
  64. package/_cjs/ScopedRef/api.cjs +2 -2
  65. package/_cjs/ScopedRef/api.cjs.map +1 -1
  66. package/_cjs/Semaphore.cjs +1 -1
  67. package/_cjs/Semaphore.cjs.map +1 -1
  68. package/_cjs/TReentrantLock/api.cjs +2 -2
  69. package/_cjs/TReentrantLock/api.cjs.map +1 -1
  70. package/_cjs/TSemaphore/api.cjs +1 -1
  71. package/_cjs/TSemaphore/api.cjs.map +1 -1
  72. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs +12 -17
  73. package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -1
  74. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +12 -17
  75. package/_cjs/collection/immutable/Conc/dropWhileIO.cjs.map +1 -1
  76. package/_cjs/collection/immutable/Conc/filterIO.cjs +2 -12
  77. package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -1
  78. package/_cjs/collection/immutable/Conc/mapIO.cjs +3 -9
  79. package/_cjs/collection/immutable/Conc/mapIO.cjs.map +1 -1
  80. package/_cjs/collection/immutable/Conc/takeWhileIO.cjs +11 -27
  81. package/_cjs/collection/immutable/Conc/takeWhileIO.cjs.map +1 -1
  82. package/_mjs/Channel/api/runScoped.mjs +1 -1
  83. package/_mjs/Channel/api/runScoped.mjs.map +1 -1
  84. package/_mjs/Channel/api.mjs +2 -2
  85. package/_mjs/Channel/api.mjs.map +1 -1
  86. package/_mjs/Fiber/FiberRuntime.mjs +111 -100
  87. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  88. package/_mjs/Future/api.mjs +1 -1
  89. package/_mjs/Future/api.mjs.map +1 -1
  90. package/_mjs/IO/api/all.mjs +24 -0
  91. package/_mjs/IO/api/all.mjs.map +1 -0
  92. package/_mjs/IO/api/asyncIO.mjs +1 -1
  93. package/_mjs/IO/api/asyncIO.mjs.map +1 -1
  94. package/_mjs/IO/api/bracketExit.mjs +1 -1
  95. package/_mjs/IO/api/bracketExit.mjs.map +1 -1
  96. package/_mjs/IO/api/concurrency.mjs +19 -2
  97. package/_mjs/IO/api/concurrency.mjs.map +1 -1
  98. package/_mjs/IO/api/disconnect.mjs +1 -1
  99. package/_mjs/IO/api/disconnect.mjs.map +1 -1
  100. package/_mjs/IO/api/foreachConcurrent.mjs +1 -1
  101. package/_mjs/IO/api/foreachConcurrent.mjs.map +1 -1
  102. package/_mjs/IO/api/foreachExec.mjs +1 -1
  103. package/_mjs/IO/api/foreachExec.mjs.map +1 -1
  104. package/_mjs/IO/api/forkIn.mjs +1 -1
  105. package/_mjs/IO/api/forkIn.mjs.map +1 -1
  106. package/_mjs/IO/api/forkScoped.mjs +1 -1
  107. package/_mjs/IO/api/forkScoped.mjs.map +1 -1
  108. package/_mjs/IO/api/fulfill.mjs +1 -1
  109. package/_mjs/IO/api/fulfill.mjs.map +1 -1
  110. package/_mjs/IO/api/interrupt.mjs +19 -7
  111. package/_mjs/IO/api/interrupt.mjs.map +1 -1
  112. package/_mjs/IO/api/raceWith.mjs +4 -4
  113. package/_mjs/IO/api/raceWith.mjs.map +1 -1
  114. package/_mjs/IO/api/timeout.mjs +8 -5
  115. package/_mjs/IO/api/timeout.mjs.map +1 -1
  116. package/_mjs/IO/api/zipConcurrent.mjs +1 -1
  117. package/_mjs/IO/api/zipConcurrent.mjs.map +1 -1
  118. package/_mjs/IO/api.mjs +78 -23
  119. package/_mjs/IO/api.mjs.map +1 -1
  120. package/_mjs/IO/definition.mjs +12 -181
  121. package/_mjs/IO/definition.mjs.map +1 -1
  122. package/_mjs/IO.mjs +1 -0
  123. package/_mjs/IO.mjs.map +1 -1
  124. package/_mjs/Layer/MemoMap.mjs +1 -1
  125. package/_mjs/Layer/MemoMap.mjs.map +1 -1
  126. package/_mjs/Push/api.mjs +145 -109
  127. package/_mjs/Push/api.mjs.map +1 -1
  128. package/_mjs/Push/definition.mjs.map +1 -1
  129. package/_mjs/STM/api/atomically.mjs +1 -1
  130. package/_mjs/STM/api/atomically.mjs.map +1 -1
  131. package/_mjs/STM/definition.mjs +1 -1
  132. package/_mjs/STM/definition.mjs.map +1 -1
  133. package/_mjs/ScopedRef/api.mjs +2 -2
  134. package/_mjs/ScopedRef/api.mjs.map +1 -1
  135. package/_mjs/Semaphore.mjs +1 -1
  136. package/_mjs/Semaphore.mjs.map +1 -1
  137. package/_mjs/TReentrantLock/api.mjs +2 -2
  138. package/_mjs/TReentrantLock/api.mjs.map +1 -1
  139. package/_mjs/TSemaphore/api.mjs +1 -1
  140. package/_mjs/TSemaphore/api.mjs.map +1 -1
  141. package/_mjs/collection/immutable/Conc/dropUntilIO.mjs +12 -17
  142. package/_mjs/collection/immutable/Conc/dropUntilIO.mjs.map +1 -1
  143. package/_mjs/collection/immutable/Conc/dropWhileIO.mjs +12 -17
  144. package/_mjs/collection/immutable/Conc/dropWhileIO.mjs.map +1 -1
  145. package/_mjs/collection/immutable/Conc/filterIO.mjs +2 -12
  146. package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -1
  147. package/_mjs/collection/immutable/Conc/mapIO.mjs +3 -9
  148. package/_mjs/collection/immutable/Conc/mapIO.mjs.map +1 -1
  149. package/_mjs/collection/immutable/Conc/takeWhileIO.mjs +11 -27
  150. package/_mjs/collection/immutable/Conc/takeWhileIO.mjs.map +1 -1
  151. package/_src/Channel/api.ts +3 -3
  152. package/_src/Fiber/FiberRuntime.ts +76 -75
  153. package/_src/IO/api/all.ts +64 -0
  154. package/_src/IO/api/concurrency.ts +33 -0
  155. package/_src/IO/api/foreachExec.ts +2 -2
  156. package/_src/IO/api/interrupt.ts +20 -7
  157. package/_src/IO/api/raceWith.ts +4 -2
  158. package/_src/IO/api/timeout.ts +21 -1
  159. package/_src/IO/api.ts +79 -27
  160. package/_src/IO/definition.ts +155 -199
  161. package/_src/IO.ts +1 -0
  162. package/_src/Push/api.ts +70 -4
  163. package/_src/Push/definition.ts +6 -0
  164. package/_src/STM/definition.ts +2 -2
  165. package/_src/collection/immutable/Conc/dropUntilIO.ts +18 -15
  166. package/_src/collection/immutable/Conc/dropWhileIO.ts +18 -17
  167. package/_src/collection/immutable/Conc/filterIO.ts +1 -11
  168. package/_src/collection/immutable/Conc/mapIO.ts +2 -9
  169. package/_src/collection/immutable/Conc/takeWhileIO.ts +19 -28
  170. package/collection/immutable/Conc/filterIO.d.ts +1 -1
  171. package/collection/immutable/Conc/mapIO.d.ts +1 -1
  172. package/collection/immutable/Conc/takeWhileIO.d.ts +1 -1
  173. package/package.json +2 -2
package/_src/Push/api.ts CHANGED
@@ -14,6 +14,49 @@ export function as<B>(b: Lazy<B>) {
14
14
  };
15
15
  }
16
16
 
17
+ interface UnsafeEmitter<E, A> {
18
+ emit: (value: A) => void;
19
+ failCause: (cause: Cause<E>) => void;
20
+ end: () => void;
21
+ }
22
+
23
+ /**
24
+ * @tsplus static fncts.io.PushOps asyncInterrupt
25
+ */
26
+ export function asyncInterrupt<R, E, A>(
27
+ make: (emitter: UnsafeEmitter<E, A>) => Either<IO<R, never, void>, Push<R, E, A>>,
28
+ ): Push<R, E, A> {
29
+ return Push<R, E, A>(<R1>(emitter: Emitter<R | R1, E, A>) =>
30
+ Do((Δ) => {
31
+ const future = Δ(Future.make<never, void>());
32
+ const scope = Δ(IO.scope);
33
+ const runtime = Δ(IO.runtime<R | R1 | R1>());
34
+ const unsafeEmitter: UnsafeEmitter<E, A> = {
35
+ emit: (value) => runtime.unsafeRunOrFork(emitter.emit(value).forkIn(scope)),
36
+ failCause: (cause) => runtime.unsafeRunOrFork(emitter.failCause(cause).fulfill(future).forkIn(scope)),
37
+ end: () => runtime.unsafeRunOrFork(emitter.end > future.succeed(undefined)),
38
+ };
39
+ const eitherPush = Δ(IO(make(unsafeEmitter)));
40
+ Δ(
41
+ eitherPush.match(
42
+ (canceller) => future.await.onInterrupt(canceller),
43
+ (push) => push.run(emitter),
44
+ ),
45
+ );
46
+ }),
47
+ );
48
+ }
49
+
50
+ /**
51
+ * @tsplus static fncts.io.PushOps async
52
+ */
53
+ export function async<E, A>(make: (emitter: UnsafeEmitter<E, A>) => void): Push<never, E, A> {
54
+ return Push.asyncInterrupt((emitter) => {
55
+ make(emitter);
56
+ return Either.left(IO.unit);
57
+ });
58
+ }
59
+
17
60
  /**
18
61
  * @tsplus static fncts.io.PushOps combineLatest
19
62
  */
@@ -79,7 +122,7 @@ export function debounce(duration: Lazy<Duration>) {
79
122
  (cause) => emitter.failCause(cause),
80
123
  latch.countDown,
81
124
  ),
82
- ),
125
+ ).forkScoped,
83
126
  );
84
127
  Δ(latch.await > emitter.end);
85
128
  }),
@@ -101,7 +144,7 @@ export function flatMapConcurrentBounded<A, R1, E1, B>(f: (a: A) => Push<R1, E1,
101
144
  return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
102
145
  return Push(<R2>(emitter: Emitter<R | R1 | R2, E | E1, B>) =>
103
146
  Do((Δ) => {
104
- const semaphore = Δ(TSemaphore(concurrency).commit);
147
+ const semaphore = Δ(Semaphore(concurrency));
105
148
  Δ(self.flatMapConcurrentUnbounded((a) => f(a).transform((io) => semaphore.withPermit(io))).run(emitter));
106
149
  }),
107
150
  );
@@ -124,7 +167,7 @@ export function flatMapConcurrentUnbounded<A, R1, E1, B>(f: (a: A) => Push<R1, E
124
167
  emitter.failCause,
125
168
  latch.countDown,
126
169
  ),
127
- ),
170
+ ).forkScoped,
128
171
  );
129
172
  Δ(latch.await > emitter.end);
130
173
  }),
@@ -467,7 +510,7 @@ export function merge<R1, E1, B>(that: Push<R1, E1, B>) {
467
510
  */
468
511
  export function mergeAll<A extends ReadonlyArray<Push<any, any, any>>>(
469
512
  streams: [...A],
470
- ): Push<_R<A[number]>, _E<A[number]>, _A<A[number]>>;
513
+ ): Push<Push.EnvironmentOf<A[number]>, Push.ErrorOf<A[number]>, Push.ValueOf<A[number]>>;
471
514
  export function mergeAll<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E, A>;
472
515
  export function mergeAll<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E, A> {
473
516
  return Push((emitter) =>
@@ -490,6 +533,29 @@ export function mergeAll<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E,
490
533
  );
491
534
  }
492
535
 
536
+ /**
537
+ * @tsplus pipeable fncts.io.Push observe
538
+ */
539
+ export function observe<A, R1, E1>(f: (a: A) => IO<R1, E1, void>, __tsplusTrace?: string) {
540
+ return <R, E>(self: Push<R, E, A>): IO<R | R1 | Scope, E | E1, void> => {
541
+ return Do((Δ) => {
542
+ const future = Δ(Future.make<E | E1, void>());
543
+ const fiber = Δ(
544
+ self.run(
545
+ Emitter(
546
+ (a) => f(a).catchAllCause((cause) => future.failCause(cause)),
547
+ (cause) => future.failCause(cause),
548
+ future.succeed(undefined),
549
+ ),
550
+ ).forkScoped,
551
+ );
552
+
553
+ Δ(future.await);
554
+ Δ(fiber.interruptFork);
555
+ });
556
+ };
557
+ }
558
+
493
559
  /**
494
560
  * @tsplus static fncts.io.PushOps repeatIOMaybe
495
561
  */
@@ -18,6 +18,12 @@ export class Push<R, E, A> {
18
18
  constructor(readonly run: <R1>(emitter: Emitter<R1, E, A>) => IO<R | R1 | Scope, never, unknown>) {}
19
19
  }
20
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;
25
+ }
26
+
21
27
  /**
22
28
  * @tsplus type fncts.io.Push.Emitter
23
29
  * @tsplus companion fncts.io.Push.EmitterOps
@@ -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]: {
@@ -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
  }
@@ -1,34 +1,25 @@
1
- import { concrete } from "@fncts/base/collection/immutable/Conc";
2
-
3
1
  /**
4
2
  * @tsplus pipeable fncts.Conc takeWhileIO
5
3
  */
6
4
  export function takeWhileIO<A, R, E>(p: (a: A) => IO<R, E, boolean>, __tsplusTrace?: string) {
7
- return (as: Conc<A>): IO<R, E, Conc<A>> => {
8
- return IO.defer(() => {
9
- concrete(as);
10
- let taking: IO<R, E, boolean> = IO.succeedNow(true);
11
- const out = Conc.builder<A>();
12
- const iterator = as.arrayIterator();
13
- let result: IteratorResult<ArrayLike<A>>;
14
- while (!(result = iterator.next()).done) {
15
- const array = result.value;
16
- for (let i = 0; i < array.length; i++) {
17
- const j = i;
18
- taking = taking.flatMap((b) => {
19
- const a = array[j]!;
20
- return (b ? p(a) : IO.succeedNow(false)).map((b1) => {
21
- if (b1) {
22
- out.append(a);
23
- return true;
24
- } else {
25
- return false;
26
- }
27
- });
28
- });
29
- }
30
- }
31
- return taking.as(out.result());
32
- });
5
+ return (self: Conc<A>): IO<R, E, Conc<A>> => {
6
+ return IO.defer(takeWhileIOLoop(self, self[Symbol.iterator](), p, 0));
33
7
  };
34
8
  }
9
+
10
+ function takeWhileIOLoop<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 ? takeWhileIOLoop(self, iterator, p, index + 1) : IO.succeed(self.take(index)),
21
+ );
22
+ } else {
23
+ return IO.succeed(Conc.empty());
24
+ }
25
+ }
@@ -1,5 +1,5 @@
1
1
  import { IO } from "@fncts/io/IO/definition";
2
- import { Conc, ConcBuilder } from "@fncts/base/collection/immutable/Conc";
2
+ import { Conc } from "@fncts/base/collection/immutable/Conc";
3
3
  /**
4
4
  * @tsplus pipeable fncts.Conc filterIO
5
5
  * @tsplus location "@fncts/io/collection/immutable/Conc/filterIO"
@@ -4,4 +4,4 @@ import { Conc } from "@fncts/base/collection/immutable/Conc";
4
4
  * @tsplus pipeable fncts.Conc mapIO
5
5
  * @tsplus location "@fncts/io/collection/immutable/Conc/mapIO"
6
6
  */
7
- export declare function mapIO<A, R, E, B>(f: (a: A) => IO<R, E, B>, __tsplusTrace?: string): (as: Conc<A>) => IO<R, E, Conc<B>>;
7
+ export declare function mapIO<A, R, E, B>(f: (a: A) => IO<R, E, B>, __tsplusTrace?: string): (self: Conc<A>) => IO<R, E, Conc<B>>;
@@ -4,4 +4,4 @@ import { Conc } from "@fncts/base/collection/immutable/Conc";
4
4
  * @tsplus pipeable fncts.Conc takeWhileIO
5
5
  * @tsplus location "@fncts/io/collection/immutable/Conc/takeWhileIO"
6
6
  */
7
- export declare function takeWhileIO<A, R, E>(p: (a: A) => IO<R, E, boolean>, __tsplusTrace?: string): (as: Conc<A>) => IO<R, E, Conc<A>>;
7
+ export declare function takeWhileIO<A, R, E>(p: (a: A) => IO<R, E, boolean>, __tsplusTrace?: string): (self: Conc<A>) => IO<R, E, Conc<A>>;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@fncts/io",
3
- "version": "0.0.34",
3
+ "version": "0.0.35",
4
4
  "dependencies": {
5
- "@fncts/base": "0.0.29",
5
+ "@fncts/base": "0.0.30",
6
6
  "@fncts/transformers": "0.0.6",
7
7
  "@fncts/typelevel": "0.0.15"
8
8
  },