can you open a bug entry because improving this part would be good. On Nov 9, 2013, at 8:48 AM, Tudor Girba <[email protected]> wrote:
> I meant having what Sven mentioned: > > Collection>>streamContents: > > Right now, we only have it in SequeanceableCollection. > > Doru > > > > On Sat, Nov 9, 2013 at 1:27 AM, Stéphane Ducasse <[email protected]> > wrote: > > On Nov 4, 2013, at 9:40 PM, Tudor Girba <[email protected]> wrote: > >> Indeed, it would be great to have a polymorphic message for constructing >> collections. In the meantime, there are three flatCollect: methods: > > > doru do you have an example of what you mean ? > > > For flaCollect: I let you discuss because I'm not enough concentrated but I > was when we worked on it long time ago. > > > > >> >> Collection>>flatCollect: aBlock >> "Evaluate aBlock for each of the receiver's elements and answer the >> list of all resulting values flatten one level. Assumes that aBlock >> returns some kind >> of collection for each element. Equivalent to the lisp's mapcan" >> >> | stream | >> self isEmpty ifTrue: [ ^ self copy ]. >> stream := (self species new: 0) writeStream. >> self do: [ :each | stream nextPutAll: (aBlock value: each) ]. >> ^ stream contents >> >> Set>>flatCollect: aBlock >> ^self flatCollectAsSet: aBlock >> >> SortedCollection>>flatCollect: aBlock >> ^ self flatCollect: aBlock as: OrderedCollection >> >> Doru >> >> >> On Mon, Nov 4, 2013 at 6:02 PM, Chris Cunningham <[email protected]> >> wrote: >> Right. I hadn't looked closely enough at the Moose one. Actually, if you >> dig it a bit deeper, #writeStream isn't defined in the Collection hierarchy >> until you get to SequenceableCollection in any case, so the Moose version is >> defined too high. >> >> So, if there is a desire for #flatCollect: outside of >> SequenceableColleciton, then this should work (based on Moose version): >> >> Collection>>flatCollect: aBlock >> "Evaluate aBlock for each of the receiver's elements and answer the >> list of all resulting values flatten one level. Assumes that aBlock >> returns some kind >> of collection for each element. Equivalent to the lisp's mapcan" >> "original written by a. Kuhn and released under MIT" >> >> | result | >> self isEmpty ifTrue: [ ^ self copy ]. >> result := (self species new: 0). >> self do: [ :each | result addAll: (aBlock value: each) ]. >> ^ result >> >> >> SequenceableCollection>>flatCollect: aBlock >> "Evaluate aBlock for each of the receiver's elements and answer the >> list of all resulting values flatten one level. Assumes that aBlock >> returns some kind >> of collection for each element. Equivalent to the lisp's mapcan" >> "original written by a. Kuhn and released under MIT" >> >> | stream | >> self isEmpty ifTrue: [ ^ self copy ]. >> ^self species streamContents: [ :stream | >> self do: [ :each | stream nextPutAll: (aBlock value: each) ] >> >> >> -Chris >> On Mon, Nov 4, 2013 at 8:46 AM, Sven Van Caekenberghe <[email protected]> wrote: >> Actually I am still confused about this, for example, >> >> Set new writeStream nextPut: 1; contents >> >> does not work, so for which non-sequenceable collections would the >> #flatCollect: code work ? >> >> I was thinking that maybe #streamContents: could be put higher up ? >> If that would not be possible, why not ? >> And how would the #flatCollect: code then work ? >> >> On 04 Nov 2013, at 17:36, Chris Cunningham <[email protected]> wrote: >> >> > On Sat, Nov 2, 2013 at 3:52 AM, Tudor Girba <[email protected]> wrote: >> > Indeed, it would be more elegant, but streamContents: is only defined in >> > SequeanceableCollection, so it is not generic enough. >> > >> > So, then use the generic one where it is defined (Collection), and a more >> > specific one that Sven suggested in SequenceableCollection. >> > >> > -Chris >> > >> > Doru >> > >> > >> > On Sat, Nov 2, 2013 at 11:21 AM, Sven Van Caekenberghe <[email protected]> >> > wrote: >> > BTW, it seems #flatten in 2.0 has become #flattened in 3.0 and that too >> > might needs the #species >> > >> > Would it also not be better and more elegant to say >> > >> > self species streamContents: [ :stream | >> > … ] >> > >> > ? >> > >> > On 02 Nov 2013, at 09:50, Sven Van Caekenberghe <[email protected]> wrote: >> > >> > > >> > > On 01 Nov 2013, at 23:55, Tudor Girba <[email protected]> wrote: >> > > >> > >> Hi, >> > >> >> > >> I see that Pharo 3.0 has a Collection>>flatCollect:. This is great as >> > >> the method proved to be very valuable in the context of Moose. >> > >> >> > >> However, the current Pharo implementation is less ideal: >> > >> >> > >> Collection>>flatCollect: aBlock >> > >> ^ Array streamContents: >> > >> [:stream | >> > >> self do: [:ea | stream nextPutAll: (aBlock value: ea)]] >> > >> >> > >> The Moose one is: >> > >> Collection>>flatCollect: aBlock >> > >> "Evaluate aBlock for each of the receiver's elements and answer the >> > >> list of all resulting values flatten one level. Assumes that >> > >> aBlock returns some kind >> > >> of collection for each element. Equivalent to the lisp's mapcan" >> > >> "original written by a. Kuhn and released under MIT" >> > >> >> > >> | stream | >> > >> self isEmpty ifTrue: [ ^ self copy ]. >> > >> stream := (self species new: 0) writeStream. >> > >> self do: [ :each | stream nextPutAll: (aBlock value: each) ]. >> > >> ^ stream contents >> > >> >> > >> The difference is in the type returned. The Pharo one always returns >> > >> Array, while the Moose one returns a collection of the same species as >> > >> the receiver. >> > > >> > > Sounds right, returning #species. >> > > >> > >> Does anyone have anything against the Moose implementation? >> > >> >> > >> Doru >> > >> >> > >> -- >> > >> www.tudorgirba.com >> > >> >> > >> "Every thing has its own flow" >> > >> > >> > >> > >> > >> > -- >> > www.tudorgirba.com >> > >> > "Every thing has its own flow" >> > >> >> >> >> >> >> >> -- >> www.tudorgirba.com >> >> "Every thing has its own flow" > > > > > -- > www.tudorgirba.com > > "Every thing has its own flow"
