Exactly!

Essentially, value: should replace pretty much all usages of perform:. For
example, if Morphic would use value: variants instead of perform: we could
script them without being obliged to create model classes. It would serve
the spirit of fast prototyping much better.

Cheers,
Doru


On Tue, Mar 11, 2014 at 11:54 PM, Carlo <snoob...@gmail.com> wrote:

> Hi
>
> Since Symbol and Blocks are polymorphic could we not simplify the code to
> be:
>
> SequenceableCollection>>sortedAs: aSortBlockOrSymbol
> "Answer a SortedCollection whose elements are the elements of the receiver.
> The sort order is defined by the argument, aSortBlockOrSymbol. The receiver
> cannot be empty. Answer a new collection. This method does not side effect
> the receiver. e.g.
> SequenceableCollection withAllSubclasses sortedAs: #name.
> SequenceableCollection withAllSubclasses sortedAs: [:class | class methodDict
> size]."
> | aSortBlock |
> aSortBlock := (#(true false )
> includes: (aSortBlockOrSymbol value: self first))
> ifTrue: [[:a :b | aSortBlockOrSymbol value: a]]
> ifFalse: [[:a :b | (aSortBlockOrSymbol value: a) < (aSortBlockOrSymbol
> value: b)]].
> ^ (SortedCollection new: self size) sortBlock: aSortBlock;
>  addAll: self;
>  yourself
>
>
>
>
>
>
> Cheers
> Carlo
>
>
>
>
> On 12 Mar 2014, at 12:32 AM, Pharo4Stef <pharo4s...@free.fr> wrote:
>
> Thanks eliot.
>
>
> On 11 Mar 2014, at 20:51, Eliot Miranda <eliot.mira...@gmail.com> wrote:
>
> 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
>  <SequenceableCollection-sortedAs.st>
>
>
>
>
>


-- 
www.tudorgirba.com

"Every thing has its own flow"

Reply via email to