I did say that the code I posted was a *GNU Smalltalk* extension.
The version of GNU Smalltalk on my machine doesn't have #detectMin:
or #detectMax:.

As for test cases:

    self assert: #(3 1 4 2) min equals: 1.
    self assert: #(3 1 4 2) max equals: 4.
    self assert: #('C' 'A' 'D' 'B') min equals: 'A'.
    self assert: #('C' 'A' 'D' 'B') max equals: 'D'.
    self assert: #(c a d b) min equals: #a.
    self assert: #(c a d b) max equals: #d.

On 22 April 2018 at 02:33, Herbert Vojčík <he...@mailbox.sk> wrote:

> Note: no need for #collect:thenFold: family, one can implement min as
>
>   min
>     ^ self detectMin: [ :x | x ]
>
> if you want to reuse existing one.
>
> But actually, the issue is, min: and max: are not there (correctly) for
> strings.
>
> Herby
>
>
> Richard O'Keefe wrote:
>
>> #('a' 'b' 'c') min
>> also fails on the grounds that ByteStrings don't understand #min:.
>> What's worse is that ByteString and ByteSymbol *do* have #max:,
>> but it's something quite different (and arguably broken).
>>
>> max: aBlock
>>      | max |
>>      self ifEmpty: [ ^ nil ].
>>      max := aBlock value: self first.
>>      self
>>          allButFirstDo:
>>              [ :each |
>>              | value |
>>              value := aBlock value: each.
>>              max := max max: value ].
>>      ^ max
>>
>> It would be better if the TComparable #min: and #max:
>> were available and the current #max: renamed to something else.
>> I have this in an extension to GNU Smalltalk:
>>
>> Collection extend [
>>      collect: collectBlock thenFold: foldBlock [
>>          |started result|
>>          started := result := nil.
>>          self do: [:each | |v|
>>              v := collectBlock value: each.
>>              result := started ifNil: [started := self. v]
>>                             ifNotNil: [foldBlock value: result value: v]].
>>          ^started ifNil: [SystemExceptions.EmptyCollection signalOn:
>> self]
>>                ifNotNil: [result]
>>      ]
>>
>>      collectThenMin: collectBlock [
>>          ^self collect: collectBlock thenFold: [:acc :y | acc min: y]
>>      ]
>>      min [
>>          ^self collectThenMin: [:each | each]
>>      ]
>>
>>      collectThenMax: collectBlock [
>>          ^self collect: collectBlock thenFold: [:acc :y | acc max: y]
>>      ]
>>      max [
>>          ^self collectThenMax: [:each | each]
>>      ]
>> ]
>>
>> CharacterArray extend [
>>      max: other [
>>        ^self < other ifTrue: [other] ifFalse: [self]
>>      ]
>>
>>      min: other [
>>        ^self < other ifTrue: [self] ifFalse: [other]
>>      ]
>> ]
>>
>>
>

Reply via email to