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"

Reply via email to