2017-04-19 16:17 GMT-03:00 Stephane Ducasse <stepharo.self@gmail.com>:
why? Iterators are powerful and avoid that we all reinvent the wheel in our own corners.
About keySelect: I do not see the point to convert a large collection into a dictionary then do yet another pass. To me it looks like a hack.
keySelect: would do a select based on the key (index in the case of SequenceableCollection) of the element, no need to create a Dictionary. keySelect: aBlock | result | result := self species new. self keysAndValuesDo: [:key :value | (aBlock value: key) ifTrue: [result add: value] ]. ^result You could implement #selectEverySecond or #selectEveryFirst in terms of the above. The name sounds weird though, but I'm not a native English speaker. Regarding #unzip it's a different story, I wouldn't use 'zip' in a selector for non Zip (compression) related methods. But do as you please, Pharo is yours as well ;) Regards!
I implemented selectEvery: (selectFirst selectSecond) as helpers.
and also unzip all in one pass. Now I have no problem to keep them for me but to me this is the wrong attitude.
Stef
testSelectEveryFirst self assert: (#(#Object #subclass: #Point #instanceVariableNames: 'x y' #classVariableNames: '' #package: 'Kernel-BasicObjects') selectEveryFirst) asArray equals: #(#Object #Point 'x y' '' 'Kernel-BasicObjects') testSelectEverySecond self assert: (#(#Object #subclass: #Point #instanceVariableNames: 'x y' #classVariableNames: '' #package: 'Kernel-BasicObjects') selectEverySecond) asArray equals: #(#subclass: #instanceVariableNames: #classVariableNames: #package:) testUnzip | uz | uz := #(#Object #subclass: #Point #instanceVariableNames: 'x y' #classVariableNames: '' #package: 'Kernel-BasicObjects') unzip. self assert: uz first asArray equals: #(#Object #Point 'x y' '' 'Kernel-BasicObjects'). self assert: uz second asArray equals: #(#subclass: #instanceVariableNames: #classVariableNames: #package:)
Esteban A. Maringolo