I meant having what Sven mentioned:

Collection>>streamContents:

Right now, we only have it in SequeanceableCollection.

Doru



On Sat, Nov 9, 2013 at 1:27 AM, Stéphane Ducasse
<stephane.duca...@inria.fr>wrote:

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


-- 
www.tudorgirba.com

"Every thing has its own flow"

Reply via email to