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