sortBy, minElementBy and maxElementBy methods

It's a choice with overriding methods or provide a global function which's
missing @noescape version and has to write documentation to telling people
what's it doing.

However, sortBy method is common in other languages.

Dave Abrahams <dabrahams@apple.com> 於 2015年12月31日星期四 寫道:

···

You don’t. Is that a problem for the intended use-cases?

-Dave

On Dec 31, 2015, at 12:11 AM, Susan Cheng <susan.doggie@gmail.com > <javascript:_e(%7B%7D,'cvml','susan.doggie@gmail.com');>> wrote:

And how do you write a @noescape version with this function?

Dave Abrahams <dabrahams@apple.com
<javascript:_e(%7B%7D,'cvml','dabrahams@apple.com');>> 於 2015年12月31日星期四
寫道:

I don’t understand that argument. Obviously the function would be
documented and there would be examples showing how to use it. Why would it
confuse people?

I think you’d need much stronger reasons to justify adding an unbounded
set of overloads (is every algorithm that takes a comparison closure going
to get one of these?) when we can handle the problem economically with a
single function.

-Dave

On Dec 31, 2015, at 12:04 AM, Susan Cheng <susan.doggie@gmail.com> wrote:

It confuses people if provide a global function byComparing in stdlib
which's doing nothing alone.

Dave Abrahams <dabrahams@apple.com> 於 2015年12月31日星期四 寫道:

Why add all those algorithms when you can write this

func byComparing<T, U: Comparable>(getComparisonKey: (T)->U) -> (T, T)
-> Bool {
  return { getComparisonKey($0) < getComparisonKey($1) }
}

peoples.sort(byComparing { $0.name })

?

-Dave

On Dec 30, 2015, at 10:38 PM, Susan Cheng via swift-evolution < >>> swift-evolution@swift.org> wrote:

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) }
    }
}

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution