| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- //===----------------------------------------------------------------------===//
- //
- // This source file is part of the Swift Algorithms open source project
- //
- // Copyright (c) 2020 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
- //
- //===----------------------------------------------------------------------===//
- // trimmingPrefix(while:)
- //===----------------------------------------------------------------------===//
- extension Collection {
- /// Returns a `SubSequence` formed by discarding all elements at the start of
- /// the collection which satisfy the given predicate.
- ///
- /// This example uses `trimmingPrefix(while:)` to get a substring without the
- /// white space at the beginning of the string:
- ///
- /// let myString = " hello, world "
- /// print(myString.trimmingPrefix(while: \.isWhitespace)) // "hello, world "
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// omitted from the resulting slice.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- public func trimmingPrefix(
- while predicate: (Element) throws -> Bool
- ) rethrows -> SubSequence {
- let start = try endOfPrefix(while: predicate)
- return self[start...]
- }
- }
- //===----------------------------------------------------------------------===//
- // trimPrefix(while:)
- //===----------------------------------------------------------------------===//
- extension Collection where Self: RangeReplaceableCollection {
- /// Mutates a `Collection` by discarding all elements at the start of it which
- /// satisfy the given predicate.
- ///
- /// This example uses `trimPrefix(while:)` to remove the white space at the
- /// beginning of the string:
- ///
- /// let myString = " hello, world "
- /// myString.trimPrefix(while: \.isWhitespace)
- /// print(myString) // "hello, world "
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// removed from the string.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- @_disfavoredOverload
- public mutating func trimPrefix(
- while predicate: (Element) throws -> Bool
- ) rethrows {
- let end = try endOfPrefix(while: predicate)
- removeSubrange(startIndex..<end)
- }
- }
- extension Collection where Self == Self.SubSequence {
- /// Mutates a `Collection` by discarding all elements at the start of it which
- /// satisfy the given predicate.
- ///
- /// This example uses `trimPrefix(while:)` to remove the white space at the
- /// beginning of the string:
- ///
- /// let myString = " hello, world "
- /// myString.trimPrefix(while: \.isWhitespace)
- /// print(myString) // "hello, world "
- ///
- /// - Parameters predicate: A closure which determines if the element should
- /// be removed from the string.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- public mutating func trimPrefix(
- while predicate: (Element) throws -> Bool
- ) rethrows {
- self = try trimmingPrefix(while: predicate)
- }
- }
- //===----------------------------------------------------------------------===//
- // trimming(while:) / trimmingSuffix(while:)
- //===----------------------------------------------------------------------===//
- extension BidirectionalCollection {
- /// Returns a `SubSequence` formed by discarding all elements at the start and
- /// end of the collection which satisfy the given predicate.
- ///
- /// This example uses `trimming(while:)` to get a substring without the white
- /// space at the beginning and end of the string:
- ///
- /// let myString = " hello, world "
- /// print(myString.trimming(while: \.isWhitespace)) // "hello, world"
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// omitted from the resulting slice.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- public func trimming(
- while predicate: (Element) throws -> Bool
- ) rethrows -> SubSequence {
- try trimmingPrefix(while: predicate).trimmingSuffix(while: predicate)
- }
-
- /// Returns a `SubSequence` formed by discarding all elements at the end of
- /// the collection which satisfy the given predicate.
- ///
- /// This example uses `trimmingSuffix(while:)` to get a substring without the
- /// white space at the end of the string:
- ///
- /// let myString = " hello, world "
- /// print(myString.trimmingSuffix(while: \.isWhitespace)) // " hello, world"
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// omitted from the resulting slice.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- public func trimmingSuffix(
- while predicate: (Element) throws -> Bool
- ) rethrows -> SubSequence {
- let end = try startOfSuffix(while: predicate)
- return self[..<end]
- }
- }
- //===----------------------------------------------------------------------===//
- // trim(while:) / trimSuffix(while:)
- //===----------------------------------------------------------------------===//
- extension BidirectionalCollection where Self: RangeReplaceableCollection {
- /// Mutates a `BidirectionalCollection` by discarding all elements at the
- /// start and at the end of it which satisfy the given predicate.
- ///
- /// This example uses `trim(while:)` to remove the white space at the
- /// beginning of the string:
- ///
- /// let myString = " hello, world "
- /// myString.trim(while: \.isWhitespace)
- /// print(myString) // "hello, world"
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// removed from the string.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- @_disfavoredOverload
- public mutating func trim(
- while predicate: (Element) throws -> Bool
- ) rethrows {
- try trimSuffix(while: predicate)
- try trimPrefix(while: predicate)
- }
-
- /// Mutates a `BidirectionalCollection` by discarding all elements at the end
- /// of it which satisfy the given predicate.
- ///
- /// This example uses `trimSuffix(while:)` to remove the white space at the
- /// beginning of the string:
- ///
- /// let myString = " hello, world "
- /// myString.trimSuffix(while: \.isWhitespace)
- /// print(myString) // " hello, world"
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// removed from the string.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- @_disfavoredOverload
- public mutating func trimSuffix(
- while predicate: (Element) throws -> Bool
- ) rethrows {
- let start = try startOfSuffix(while: predicate)
- removeSubrange(start..<endIndex)
- }
- }
- extension BidirectionalCollection where Self == Self.SubSequence {
- /// Mutates a `BidirectionalCollection` by discarding all elements at the
- /// start and at the end of it which satisfy the given predicate.
- ///
- /// This example uses `trim(while:)` to remove the white space at the
- /// beginning of the string:
- ///
- /// let myString = " hello, world "
- /// myString.trim(while: \.isWhitespace)
- /// print(myString) // "hello, world"
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// removed from the string.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- public mutating func trim(
- while predicate: (Element) throws -> Bool
- ) rethrows {
- self = try trimming(while: predicate)
- }
- /// Mutates a `BidirectionalCollection` by discarding all elements at the end
- /// of it which satisfy the given predicate.
- ///
- /// This example uses `trimSuffix(while:)` to remove the white space at the
- /// beginning of the string:
- ///
- /// let myString = " hello, world "
- /// myString.trimSuffix(while: \.isWhitespace)
- /// print(myString) // " hello, world"
- ///
- /// - Parameter predicate: A closure which determines if the element should be
- /// removed from the string.
- ///
- /// - Complexity: O(*n*), where *n* is the length of this collection.
- ///
- @inlinable
- public mutating func trimSuffix(
- while predicate: (Element) throws -> Bool
- ) rethrows {
- self = try trimmingSuffix(while: predicate)
- }
- }
|