@fncts/io 0.0.34 → 0.0.35
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.
- package/Fiber/FiberRuntime.d.ts +7 -7
- package/IO/api/all.d.ts +41 -0
- package/IO/api/concurrency.d.ts +11 -0
- package/IO/api/interrupt.d.ts +1 -1
- package/IO/api/raceWith.d.ts +2 -1
- package/IO/api.d.ts +7 -2
- package/IO/definition.d.ts +103 -127
- package/IO.d.ts +1 -0
- package/Push/api.d.ts +25 -4
- package/Push/definition.d.ts +17 -0
- package/STM/definition.d.ts +2 -2
- package/Sink/api.d.ts +19 -19
- package/_cjs/Channel/api/runScoped.cjs +1 -1
- package/_cjs/Channel/api/runScoped.cjs.map +1 -1
- package/_cjs/Channel/api.cjs +2 -2
- package/_cjs/Channel/api.cjs.map +1 -1
- package/_cjs/Fiber/FiberRuntime.cjs +110 -98
- package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
- package/_cjs/Future/api.cjs +1 -1
- package/_cjs/Future/api.cjs.map +1 -1
- package/_cjs/IO/api/all.cjs +33 -0
- package/_cjs/IO/api/all.cjs.map +1 -0
- package/_cjs/IO/api/asyncIO.cjs +1 -1
- package/_cjs/IO/api/asyncIO.cjs.map +1 -1
- package/_cjs/IO/api/bracketExit.cjs +1 -1
- package/_cjs/IO/api/bracketExit.cjs.map +1 -1
- package/_cjs/IO/api/concurrency.cjs +25 -4
- package/_cjs/IO/api/concurrency.cjs.map +1 -1
- package/_cjs/IO/api/disconnect.cjs +1 -1
- package/_cjs/IO/api/disconnect.cjs.map +1 -1
- package/_cjs/IO/api/foreachConcurrent.cjs +1 -1
- package/_cjs/IO/api/foreachConcurrent.cjs.map +1 -1
- package/_cjs/IO/api/foreachExec.cjs +1 -1
- package/_cjs/IO/api/foreachExec.cjs.map +1 -1
- package/_cjs/IO/api/forkIn.cjs +1 -1
- package/_cjs/IO/api/forkIn.cjs.map +1 -1
- package/_cjs/IO/api/forkScoped.cjs +1 -1
- package/_cjs/IO/api/forkScoped.cjs.map +1 -1
- package/_cjs/IO/api/fulfill.cjs +1 -1
- package/_cjs/IO/api/fulfill.cjs.map +1 -1
- package/_cjs/IO/api/interrupt.cjs +18 -6
- package/_cjs/IO/api/interrupt.cjs.map +1 -1
- package/_cjs/IO/api/raceWith.cjs +4 -4
- package/_cjs/IO/api/raceWith.cjs.map +1 -1
- package/_cjs/IO/api/timeout.cjs +8 -5
- package/_cjs/IO/api/timeout.cjs.map +1 -1
- package/_cjs/IO/api/zipConcurrent.cjs +1 -1
- package/_cjs/IO/api/zipConcurrent.cjs.map +1 -1
- package/_cjs/IO/api.cjs +78 -20
- package/_cjs/IO/api.cjs.map +1 -1
- package/_cjs/IO/definition.cjs +14 -191
- package/_cjs/IO/definition.cjs.map +1 -1
- package/_cjs/IO.cjs +11 -0
- package/_cjs/IO.cjs.map +1 -1
- package/_cjs/Layer/MemoMap.cjs +1 -1
- package/_cjs/Layer/MemoMap.cjs.map +1 -1
- package/_cjs/Push/api.cjs +149 -110
- package/_cjs/Push/api.cjs.map +1 -1
- package/_cjs/Push/definition.cjs.map +1 -1
- package/_cjs/STM/api/atomically.cjs +1 -1
- package/_cjs/STM/api/atomically.cjs.map +1 -1
- package/_cjs/STM/definition.cjs +1 -1
- package/_cjs/STM/definition.cjs.map +1 -1
- package/_cjs/ScopedRef/api.cjs +2 -2
- package/_cjs/ScopedRef/api.cjs.map +1 -1
- package/_cjs/Semaphore.cjs +1 -1
- package/_cjs/Semaphore.cjs.map +1 -1
- package/_cjs/TReentrantLock/api.cjs +2 -2
- package/_cjs/TReentrantLock/api.cjs.map +1 -1
- package/_cjs/TSemaphore/api.cjs +1 -1
- package/_cjs/TSemaphore/api.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/dropUntilIO.cjs +12 -17
- package/_cjs/collection/immutable/Conc/dropUntilIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/dropWhileIO.cjs +12 -17
- package/_cjs/collection/immutable/Conc/dropWhileIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/filterIO.cjs +2 -12
- package/_cjs/collection/immutable/Conc/filterIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/mapIO.cjs +3 -9
- package/_cjs/collection/immutable/Conc/mapIO.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/takeWhileIO.cjs +11 -27
- package/_cjs/collection/immutable/Conc/takeWhileIO.cjs.map +1 -1
- package/_mjs/Channel/api/runScoped.mjs +1 -1
- package/_mjs/Channel/api/runScoped.mjs.map +1 -1
- package/_mjs/Channel/api.mjs +2 -2
- package/_mjs/Channel/api.mjs.map +1 -1
- package/_mjs/Fiber/FiberRuntime.mjs +111 -100
- package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
- package/_mjs/Future/api.mjs +1 -1
- package/_mjs/Future/api.mjs.map +1 -1
- package/_mjs/IO/api/all.mjs +24 -0
- package/_mjs/IO/api/all.mjs.map +1 -0
- package/_mjs/IO/api/asyncIO.mjs +1 -1
- package/_mjs/IO/api/asyncIO.mjs.map +1 -1
- package/_mjs/IO/api/bracketExit.mjs +1 -1
- package/_mjs/IO/api/bracketExit.mjs.map +1 -1
- package/_mjs/IO/api/concurrency.mjs +19 -2
- package/_mjs/IO/api/concurrency.mjs.map +1 -1
- package/_mjs/IO/api/disconnect.mjs +1 -1
- package/_mjs/IO/api/disconnect.mjs.map +1 -1
- package/_mjs/IO/api/foreachConcurrent.mjs +1 -1
- package/_mjs/IO/api/foreachConcurrent.mjs.map +1 -1
- package/_mjs/IO/api/foreachExec.mjs +1 -1
- package/_mjs/IO/api/foreachExec.mjs.map +1 -1
- package/_mjs/IO/api/forkIn.mjs +1 -1
- package/_mjs/IO/api/forkIn.mjs.map +1 -1
- package/_mjs/IO/api/forkScoped.mjs +1 -1
- package/_mjs/IO/api/forkScoped.mjs.map +1 -1
- package/_mjs/IO/api/fulfill.mjs +1 -1
- package/_mjs/IO/api/fulfill.mjs.map +1 -1
- package/_mjs/IO/api/interrupt.mjs +19 -7
- package/_mjs/IO/api/interrupt.mjs.map +1 -1
- package/_mjs/IO/api/raceWith.mjs +4 -4
- package/_mjs/IO/api/raceWith.mjs.map +1 -1
- package/_mjs/IO/api/timeout.mjs +8 -5
- package/_mjs/IO/api/timeout.mjs.map +1 -1
- package/_mjs/IO/api/zipConcurrent.mjs +1 -1
- package/_mjs/IO/api/zipConcurrent.mjs.map +1 -1
- package/_mjs/IO/api.mjs +78 -23
- package/_mjs/IO/api.mjs.map +1 -1
- package/_mjs/IO/definition.mjs +12 -181
- package/_mjs/IO/definition.mjs.map +1 -1
- package/_mjs/IO.mjs +1 -0
- package/_mjs/IO.mjs.map +1 -1
- package/_mjs/Layer/MemoMap.mjs +1 -1
- package/_mjs/Layer/MemoMap.mjs.map +1 -1
- package/_mjs/Push/api.mjs +145 -109
- package/_mjs/Push/api.mjs.map +1 -1
- package/_mjs/Push/definition.mjs.map +1 -1
- package/_mjs/STM/api/atomically.mjs +1 -1
- package/_mjs/STM/api/atomically.mjs.map +1 -1
- package/_mjs/STM/definition.mjs +1 -1
- package/_mjs/STM/definition.mjs.map +1 -1
- package/_mjs/ScopedRef/api.mjs +2 -2
- package/_mjs/ScopedRef/api.mjs.map +1 -1
- package/_mjs/Semaphore.mjs +1 -1
- package/_mjs/Semaphore.mjs.map +1 -1
- package/_mjs/TReentrantLock/api.mjs +2 -2
- package/_mjs/TReentrantLock/api.mjs.map +1 -1
- package/_mjs/TSemaphore/api.mjs +1 -1
- package/_mjs/TSemaphore/api.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/dropUntilIO.mjs +12 -17
- package/_mjs/collection/immutable/Conc/dropUntilIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/dropWhileIO.mjs +12 -17
- package/_mjs/collection/immutable/Conc/dropWhileIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/filterIO.mjs +2 -12
- package/_mjs/collection/immutable/Conc/filterIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/mapIO.mjs +3 -9
- package/_mjs/collection/immutable/Conc/mapIO.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/takeWhileIO.mjs +11 -27
- package/_mjs/collection/immutable/Conc/takeWhileIO.mjs.map +1 -1
- package/_src/Channel/api.ts +3 -3
- package/_src/Fiber/FiberRuntime.ts +76 -75
- package/_src/IO/api/all.ts +64 -0
- package/_src/IO/api/concurrency.ts +33 -0
- package/_src/IO/api/foreachExec.ts +2 -2
- package/_src/IO/api/interrupt.ts +20 -7
- package/_src/IO/api/raceWith.ts +4 -2
- package/_src/IO/api/timeout.ts +21 -1
- package/_src/IO/api.ts +79 -27
- package/_src/IO/definition.ts +155 -199
- package/_src/IO.ts +1 -0
- package/_src/Push/api.ts +70 -4
- package/_src/Push/definition.ts +6 -0
- package/_src/STM/definition.ts +2 -2
- package/_src/collection/immutable/Conc/dropUntilIO.ts +18 -15
- package/_src/collection/immutable/Conc/dropWhileIO.ts +18 -17
- package/_src/collection/immutable/Conc/filterIO.ts +1 -11
- package/_src/collection/immutable/Conc/mapIO.ts +2 -9
- package/_src/collection/immutable/Conc/takeWhileIO.ts +19 -28
- package/collection/immutable/Conc/filterIO.d.ts +1 -1
- package/collection/immutable/Conc/mapIO.d.ts +1 -1
- package/collection/immutable/Conc/takeWhileIO.d.ts +1 -1
- 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 = Δ(
|
|
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<
|
|
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
|
*/
|
package/_src/Push/definition.ts
CHANGED
|
@@ -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
|
package/_src/STM/definition.ts
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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.
|
|
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 (
|
|
6
|
-
return IO.
|
|
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 (
|
|
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
|
|
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): (
|
|
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): (
|
|
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>>;
|