and here's one with a better comment that includes examples

On Tue, Mar 11, 2014 at 12:19 PM, Eliot Miranda <eliot.mira...@gmail.com>wrote:

> Hi Alexandre,
>
>     IMO the isKindOf:, apart from being ugly, will hurt performance badly.
>  Why not apply aSortBlockOrSymbol to the first element and then choose the
> block appropriately?  e.g.
>
>     aSortBlockOrSymbol isSymbol
>         ifTrue:
>             [(#(true false) includes: (self first perform:
> aSortBlockOrSymbol)
>                 ifTrue:
>                      [[:a :b | (a perform: aSortBlockOrSymbol)]]
>                 ifFalse:
>                      [[:a :b | (a perform: aSortBlockOrSymbol) < (b
> perform: aSortBlockOrSymbol)]]]
>     ...
>
> Nicer to read and faster, no?
>
> On Tue, Mar 11, 2014 at 8:17 AM, Alexandre Bergel <alexandre.ber...@me.com
> > wrote:
>
>> hi Uko,
>>
>> For Roassal, we have a #sortedAs: defined on all collections
>>
>> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>>  SequenceableCollection>>sortedAs: aSortBlockOrSymbol
>>         "Answer a SortedCollection whose elements are the elements of the
>>         receiver. The sort order is defined by the argument, aSortBlock."
>>         "Return a new collection. This method does not do a side effect"
>>
>>         | aSortedCollection aSortBlock |
>>         aSortedCollection := SortedCollection new: self size.
>>         aSortBlock :=
>>                 aSortBlockOrSymbol isSymbol
>>                         ifTrue: [ [:a :b | |t1 t2|
>>                                                         t1 := (a perform:
>> aSortBlockOrSymbol).
>>                                                         t2 := (b perform:
>> aSortBlockOrSymbol).
>>                                                         ((t1 isKindOf:
>> Boolean) and: [t2 isKindOf: Boolean])
>>                                                                 ifTrue: [
>> t1 ]
>>                                                                 ifFalse:
>> [ t1 < t2 ] ] ]
>>                         ifFalse: [
>>                                 (aSortBlockOrSymbol numArgs = 1)
>>                                         ifTrue: [ [ :v1 :v2 |
>> (aSortBlockOrSymbol value: v1) < (aSortBlockOrSymbol value: v2) ] ]
>>                                         ifFalse: [ aSortBlockOrSymbol ] ].
>>         aSortedCollection sortBlock: aSortBlock.
>>         aSortedCollection addAll: self.
>>         ^ aSortedCollection
>> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>>
>> You can use it for example:
>> (1 to: 4) sortedAs: #odd
>>         => a SortedCollection(1 3 2 4)
>>
>> Collection withAllSubclasses sortedAs: #numberOfMethods
>>         => a SortedCollection(HashBag IdentityHashBag ...)
>>
>> This is really handy. It should be part of Pharo I believe.
>>
>> Cheers,
>> Alexandre
>>
>>
>> On Mar 11, 2014, at 5:19 AM, Yuriy Tymchuk <yuriy.tymc...@me.com> wrote:
>>
>> > Hi guys.
>> >
>> > This is a thing that I encounter quite often.
>> >
>> > Eg I have a collection of projects and I want to sort them by creation
>> date. It would be nice to be able to do something like:
>> >
>> > projects sortByProp: #creationDate
>> >
>> > or by birth date of the author
>> >
>> > projects sortByProp: [ :proj | proj author birthDate ]
>> >
>> > Maybe I'm wrong, but as I've told already I encounter it quite often
>> and writing something like
>> >
>> > projects sortBy: [ :prev :next | prev creationDate <= next creationDate
>> ]
>> >
>> > is boring for me.
>> >
>> > Cheers.
>> > Uko
>>
>> --
>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>> Alexandre Bergel  http://www.bergel.eu
>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>>
>>
>>
>>
>>
>
>
> --
> best,
> Eliot
>



-- 
best,
Eliot

Attachment: SequenceableCollection-sortedAs.st
Description: Binary data

Reply via email to