File: Sequence%2BFirstMap.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (41 lines) | stat: -rw-r--r-- 1,675 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021 Apple Inc. and the Swift project authors
 Licensed under Apache License v2.0 with Runtime Library Exception

 See https://swift.org/LICENSE.txt for license information
 See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/

import Foundation

extension Sequence {
    /// Maps the sequence using the given closure and returns the first non-nil value.
    ///
    /// This behaves as a combination of `first(where:)` and `map(:_)` where the predicate and the mapping closure perform the same transformation.
    ///
    /// This function is both lazy, stopping once it finds a non-nil value, and only applies the transformation to an element once. This is especially useful when
    /// the transformation is slow or expensive to perform:
    ///
    /// ```swift
    /// let html = identifiers.mapFirst(where: { id in
    ///   guard let result = lookupPageWithID(id).fetchMarkup() else {
    ///     return nil
    ///   }
    ///   return result.html
    /// })
    /// ```
    ///
    /// - Parameter predicate: A mapping closure that accepts an element of this sequence as its parameter and returns a transformed value or `nil`.
    /// - Throws: Any error that's raised by the mapping closure.
    /// - Returns: The first mapped, non-nil value, or `nil` if the mapping closure returned `nil` for every value in the sequence.
    func mapFirst<T>(where predicate: (Element) throws -> T?) rethrows -> T? {
        for element in self {
            if let result = try predicate(element) {
                return result
            }
        }
        return nil
    }
}