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" >
