2018-04-25 14:26 GMT+02:00 Richard O'Keefe <raoknz@gmail.com>:
(aSortFunction value: x value: y) returns a Boolean; (aSortFunction value: x value: x) returns true. So you can already set up a SortedCollection using a SortFunction. So yes, that would work.
Yes. It was original goal to introduce them. I created another thread in dev list "SortedCollection based on SortFunction".
But there is no reason why #reversed (or my preference, #converse) could not work on sortBlocks.
It will. But I think it is bad approach. Because any time you will need new kind of sort operation you will be forced extend BlockClosure. In general reversed/converse has no meaning for block. With SortFunction only simple extension #asSortFunction is required.
On 25 April 2018 at 23:27, Denis Kudriashov <dionisiydk@gmail.com> wrote:
Hi Richard.
I agree with your proposal. But it force me to think that we should completely move to SortFunction's. In that case SortCollection will have sortFunction variable instead of sortBlock. And for your scenario reverse operation will be simple expression: "sortFunction := sortFunction reversed".
2018-04-23 3:09 GMT+02:00 Richard O'Keefe <raoknz@gmail.com>:
Test case: #(1 2 4) asSortedCollection reverse add: 3; yourself <print it> The answer *should* be aSortedCollection(4 3 2 1) but *is* aSortedCollection(4 2 1 3). This works in Squeak. The problem is that SortedCollection does not define #reverse[d] but simply inherits it(them), and the inherited code pays no attention to the sortBlock.
I propose adding the following two methods to SortedCollection:
reverseInPlace |a z| a := firstIndex. z := lastIndex. [a < z] whileTrue: [array swap: a with: z. a := a + 1. z := z - 1]. sortBlock := sortBlock ifNil: [[:x :y | y <= x]] ifNotNil: [[:x :y | sortBlock value: y value: x]]. ^self
reversed ^self copy reverseInPlace
The ANSI method is #reverse, not #reversed, but Pharo defines #reverse to call #reversed, and OrderedCollection overrides #reversed, so SortedCollection *must* override #reversed.
#reverseInPlace is the name Squeak uses for the other method. It also has a definition in SequenceableCollection, which is not but is equivalent to
reverseInPlace |a z| a := 1. z := self size. [a < z] whileTrue: [self swap: a with: z. a := a + 1. z := z - 1].l ^self
r