2018-04-25 14:26 GMT+02:00 Richard O'Keefe <rao...@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 <dionisi...@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 <rao...@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 >>> >>> >> >