Hyperlinkv0.8.0-beta.28

Array

Array.findLastconsteffect/Array.ts:1823
<A, B>(f: (a: NoInfer<A>, i: number) => Option.Option<B>): (
  self: Iterable<A>
) => Option.Option<B>
<A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (
  self: Iterable<A>
) => Option.Option<B>
<A>(predicate: (a: NoInfer<A>, i: number) => boolean): (
  self: Iterable<A>
) => Option.Option<A>
<A, B>(
  self: Iterable<A>,
  f: (a: A, i: number) => Option.Option<B>
): Option.Option<B>
<A, B extends A>(
  self: Iterable<A>,
  refinement: (a: A, i: number) => a is B
): Option.Option<B>
<A>(
  self: Iterable<A>,
  predicate: (a: A, i: number) => boolean
): Option.Option<A>

Returns the last element matching a predicate, refinement, or mapping function, wrapped in Option.

When to use

Use to find the last matching element from the end of an array.

Details

Searches from the end of the array. If no element matches, this returns Option.none().

Example (Finding the last match)

import { Array } from "effect"

console.log(Array.findLast([1, 2, 3, 4, 5], (n) => n % 2 === 0)) // Option.some(4)
Source effect/Array.ts:182330 lines
export const findLast: {
  <A, B>(f: (a: NoInfer<A>, i: number) => Option.Option<B>): (self: Iterable<A>) => Option.Option<B>
  <A, B extends A>(refinement: (a: NoInfer<A>, i: number) => a is B): (self: Iterable<A>) => Option.Option<B>
  <A>(predicate: (a: NoInfer<A>, i: number) => boolean): (self: Iterable<A>) => Option.Option<A>
  <A, B>(self: Iterable<A>, f: (a: A, i: number) => Option.Option<B>): Option.Option<B>
  <A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Option.Option<B>
  <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option.Option<A>
} = dual(
  2,
  <A>(
    self: Iterable<A>,
    f: ((a: A, i: number) => boolean) | ((a: A, i: number) => Option.Option<A>)
  ): Option.Option<A> => {
    const input = fromIterable(self)
    for (let i = input.length - 1; i >= 0; i--) {
      const a = input[i]
      const o = f(a, i)
      if (typeof o === "boolean") {
        if (o) {
          return Option.some(a)
        }
      } else {
        if (Option.isSome(o)) {
          return o
        }
      }
    }
    return Option.none()
  }
)
Referenced by 1 symbols