@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.
- 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>>;
|