[swift-evolution] sortBy, minElementBy and maxElementBy methods

Susan Cheng susan.doggie at gmail.com
Thu Dec 31 00:38:31 CST 2015


Consider the follows:


struct Person {



    var name: String

    var age: Int

}


let peoples = [Person(name: "Hawk", age: 24), Person(name: "Andrew", age: 23
)]


let youngest = peoples.minElement { $0.age < $1.age }


print(youngest?.name)


it's silly that we always have to write the code like { $0.some < $1.some }
or { some($0) < some($1) }


so, we should add those methods to stdlib:


extension SequenceType {

    /// Returns the minimum element in `self` or `nil` if the sequence is
empty.

    ///

    /// - Complexity: O(`elements.count`).

    ///

    @warn_unused_result

    public func minElement<R : Comparable>(@noescape by:
(Generator.Element) throws -> R) rethrows -> Generator.Element? {

        return try self.minElement { try by($0) < by($1) }

    }

    /// Returns the maximum element in `self` or `nil` if the sequence is
empty.

    ///

    /// - Complexity: O(`elements.count`).

    ///

    @warn_unused_result

    public func maxElement<R : Comparable>(@noescape by:
(Generator.Element) throws -> R) rethrows -> Generator.Element? {

        return try self.maxElement { try by($0) < by($1) }

    }

}


public extension MutableCollectionType {



    /// Return an `Array` containing the sorted elements of `source`.

    /// according to `by`.

    ///

    /// The sorting algorithm is not stable (can change the relative order
of

    /// elements that compare equal).

    @warn_unused_result(mutable_variant="sortInPlace")

    func sort<R : Comparable>(@noescape by: (Generator.Element) -> R) -> [
Generator.Element] {

        return self.sort { by($0) < by($1) }

    }

}


public extension MutableCollectionType where Self.Index :
RandomAccessIndexType {



    /// Sort `self` in-place according to `by`.

    ///

    /// The sorting algorithm is not stable (can change the relative order
of

    /// elements that compare equal).

    mutating func sortInPlace<R : Comparable>(@noescape by: (Generator.
Element) -> R) {

        self.sortInPlace { by($0) < by($1) }

    }

}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151231/5226f7cb/attachment.html>


More information about the swift-evolution mailing list