On Nov 4, 2013, at 9:40 PM, Tudor Girba <tu...@tudorgirba.com> 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 <cunningham...@gmail.com> > 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 <s...@stfx.eu> 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 <cunningham...@gmail.com> wrote: > > > On Sat, Nov 2, 2013 at 3:52 AM, Tudor Girba <tu...@tudorgirba.com> 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 <s...@stfx.eu> 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 <s...@stfx.eu> wrote: > > > > > > > > On 01 Nov 2013, at 23:55, Tudor Girba <tu...@tudorgirba.com> 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"