Hyperlinkv0.8.0-beta.28

Sink

Sink.takeWhileFilterconsteffect/Sink.ts:1594
<In, Out, X>(filter: Filter.Filter<In, Out, X>): Sink<Array<Out>, In, In>

Applies a Filter to input elements while it succeeds, collecting each successful output.

Details

The first input for which the filter fails is consumed and excluded from the result. Any later elements from the same pulled array are returned as leftovers.

constructors
Source effect/Sink.ts:159423 lines
export const takeWhileFilter = <In, Out, X>(
  filter: Filter.Filter<In, Out, X>
): Sink<Array<Out>, In, In> =>
  fromTransform((upstream) => {
    const out = Arr.empty<Out>()
    return upstream.pipe(
      Effect.flatMap((arr) => {
        for (let i = 0; i < arr.length; i++) {
          const result = filter(arr[i])
          if (Result.isFailure(result)) {
            const leftover: Arr.NonEmptyReadonlyArray<In> | undefined = (i + 1) < arr.length
              ? arr.slice(i + 1) as any
              : undefined
            return Cause.done([out, leftover] as const)
          }
          out.push(result.success)
        }
        return Effect.void
      }),
      Effect.forever({ disableYield: true }),
      Pull.catchDone((end) => Effect.succeed<End<Array<Out>, In>>(end ?? [out]))
    )
  })