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 <herby@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]
�� �� ��]
]