I second the Peter’s idea. I don’t think that we need a dedicated index-based select when we already have withIndex*. Also one year after adding withIndexSelect: we can mine public repos and see how many projects use the method and the selection block does not read the first (each) parameter.
Uko > On 20 Apr 2017, at 00:07, Peter Uhnak <[email protected]> wrote: > > We already have > > * #withIndexCollect: > * #withIndexDo: > > > So why not #withIndexSelect: ? > > #(#Object #subclass: #Point #instanceVariableNames:) withIndexSelect: [ :each > :i | i \\ 2 = 0 ] > > Peter > > p.s. for every second you could also do > aCollection pairsCollect: [ :first :second | second ] > > > On Wed, Apr 19, 2017 at 04:35:07PM -0300, Esteban A. Maringolo wrote: >> 2017-04-19 16:17 GMT-03:00 Stephane Ducasse <[email protected]>: >>> 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 >> >
