Hyperlinkv0.8.0-beta.28

Channel

Channel.filterArrayconsteffect/Channel.ts:3382
<OutElem, B extends OutElem>(
  refinement: Predicate.Refinement<OutElem, B>
): <OutErr, OutDone, InElem, InErr, InDone, Env>(
  self: Channel<
    Arr.NonEmptyReadonlyArray<OutElem>,
    OutErr,
    OutDone,
    InElem,
    InErr,
    InDone,
    Env
  >
) => Channel<
  Arr.NonEmptyReadonlyArray<B>,
  OutErr,
  OutDone,
  InElem,
  InErr,
  InDone,
  Env
>
<OutElem>(predicate: Predicate.Predicate<Types.NoInfer<OutElem>>): <
  OutErr,
  OutDone,
  InElem,
  InErr,
  InDone,
  Env
>(
  self: Channel<
    Arr.NonEmptyReadonlyArray<OutElem>,
    OutErr,
    OutDone,
    InElem,
    InErr,
    InDone,
    Env
  >
) => Channel<
  Arr.NonEmptyReadonlyArray<OutElem>,
  OutErr,
  OutDone,
  InElem,
  InErr,
  InDone,
  Env
>
<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B extends OutElem>(
  self: Channel<
    Arr.NonEmptyReadonlyArray<OutElem>,
    OutErr,
    OutDone,
    InElem,
    InErr,
    InDone,
    Env
  >,
  refinement: Predicate.Refinement<OutElem, B>
): Channel<
  Arr.NonEmptyReadonlyArray<B>,
  OutErr,
  OutDone,
  InElem,
  InErr,
  InDone,
  Env
>
<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
  self: Channel<
    Arr.NonEmptyReadonlyArray<OutElem>,
    OutErr,
    OutDone,
    InElem,
    InErr,
    InDone,
    Env
  >,
  predicate: Predicate.Predicate<Types.NoInfer<OutElem>>
): Channel<
  Arr.NonEmptyReadonlyArray<OutElem>,
  OutErr,
  OutDone,
  InElem,
  InErr,
  InDone,
  Env
>

Filters arrays of elements emitted by a channel, applying the filter to each element within the arrays and only emitting non-empty filtered arrays.

Example (Filtering array output)

import { Array, Channel } from "effect"

const nonEmptyArrayPredicate = Array.isReadonlyArrayNonEmpty

// Create a channel that outputs arrays of mixed data
const arrayChannel = Channel.fromIterable([
  Array.make(1, 2, 3, 4, 5),
  Array.make(6, 7, 8, 9, 10),
  Array.make(11, 12, 13, 14, 15)
]).pipe(Channel.filter(nonEmptyArrayPredicate))

// Filter arrays to keep only even numbers
const evenArraysChannel = Channel.filterArray(arrayChannel, (n) => n % 2 === 0)
// Outputs: [2, 4], [6, 8, 10], [12, 14]
// Note: Only non-empty filtered arrays are emitted

// Arrays that would become empty after filtering are discarded entirely
const oddChannel = Channel.fromIterable([
  Array.make(1, 3, 5),
  Array.make(2, 4),
  Array.make(7, 9)
]).pipe(Channel.filter(nonEmptyArrayPredicate))
const filteredOddChannel = Channel.filterArray(oddChannel, (n) => n % 2 === 0)
// Outputs: [2, 4] (the arrays [1,3,5] and [7,9] are discarded)
filtering
Source effect/Channel.ts:338238 lines
export const filterArray: {
  <OutElem, B extends OutElem>(
    refinement: Predicate.Refinement<OutElem, B>
  ): <OutErr, OutDone, InElem, InErr, InDone, Env>(
    self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
  ) => Channel<Arr.NonEmptyReadonlyArray<B>, OutErr, OutDone, InElem, InErr, InDone, Env>
  <OutElem>(
    predicate: Predicate.Predicate<Types.NoInfer<OutElem>>
  ): <OutErr, OutDone, InElem, InErr, InDone, Env>(
    self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
  ) => Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
  <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B extends OutElem>(
    self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
    refinement: Predicate.Refinement<OutElem, B>
  ): Channel<Arr.NonEmptyReadonlyArray<B>, OutErr, OutDone, InElem, InErr, InDone, Env>
  <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
    self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
    predicate: Predicate.Predicate<Types.NoInfer<OutElem>>
  ): Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
} = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
  predicate: Predicate.Predicate<Types.NoInfer<OutElem>>
): Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env> =>
  transformPull(self, (pull) =>
    Effect.succeed(Effect.flatMap(
      pull,
      function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone> {
        const passes: Array<OutElem> = []
        for (let i = 0; i < arr.length; i++) {
          if (predicate(arr[i] as Types.NoInfer<OutElem>)) {
            passes.push(arr[i])
          }
        }
        return Arr.isReadonlyArrayNonEmpty(passes)
          ? Effect.succeed(passes)
          : Effect.flatMap(pull, loop)
      }
    ))))
Referenced by 1 symbols