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


Reply via email to