[Pharo-dev] flatCollect:

Stéphane Ducasse stephane.ducasse at inria.fr
Fri Nov 8 19:27:16 EST 2013


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20131109/9628504a/attachment-0002.html>


More information about the Pharo-dev mailing list