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 <[email protected]> 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]
>> ]
>> ]
>>
>>
>