| 1355 | * @since 4.0.0 |
| 1356 | */ |
| 1357 | export const reduceWhileArrayEffect = <S, In, E, R>( |
| 1358 | initial: LazyArg<S>, |
| 1359 | predicate: Predicate<S>, |
| 1360 | f: (s: S, input: NonEmptyReadonlyArray<In>) => Effect.Effect<S, E, R> |
| 1361 | ): Sink<S, In, never, E, R> => |
| 1362 | fromTransform((upstream) => { |
| 1363 | let state = initial() |
| 1364 | if (!predicate(state)) { |
| 1365 | return Effect.succeed([state] as const) |
| 1366 | } |
| 1367 | return upstream.pipe( |
| 1368 | Effect.flatMap((arr) => f(state, arr)), |
| 1369 | Effect.flatMap((s) => { |
| 1370 | state = s |
| 1371 | if (!predicate(state)) { |
| 1372 | return Cause.done() |
| 1373 | } |
| 1374 | return Effect.void |
| 1375 | }), |
| 1376 | Effect.forever({ disableYield: true }), |
| 1377 | Pull.catchDone(() => Effect.succeed([state] as const)) |
| 1378 | ) |
| 1379 | }) |
| 1380 | |
| 1381 | /** |
| 1382 | * A sink that reduces its inputs using the provided function `f` starting from |