#flatten (Re: [squeak-dev] The Inbox: Collections-fbs.489.mcz)

Levente Uzonyi leves at elte.hu
Mon Aug 20 22:29:28 UTC 2012


On Mon, 20 Aug 2012, Frank Shearar wrote:

> On 20 August 2012 21:54, Levente Uzonyi <leves at elte.hu> wrote:
>> On Mon, 20 Aug 2012, commits at source.squeak.org wrote:
>>
>>> Frank Shearar uploaded a new version of Collections to project The Inbox:
>>> http://source.squeak.org/inbox/Collections-fbs.489.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: Collections-fbs.489
>>> Author: fbs
>>> Time: 20 August 2012, 4:51:36.018 pm
>>> UUID: d1834809-65b5-46c0-9b26-fea7ec04a946
>>> Ancestors: Collections-ul.488
>>>
>>> SequenceableCollection >> flatten turns a nested SequenceableCollection -
>>> a collection of collections of ... -  into a simple collection. Thus, #(1 (2
>>> 3) (4)) flatten = #(1 2 3 4).
>>
>>
>> #flatten was discussed several times, even we (Balázs and me) implemented it
>> once, see Collections-klub.130.mcz in the Treated Inbox. I think our
>> implementation is better, because
>> - it uses #flattened as selector
>> - it uses double dispatch
>> - it works well with Strings (try #('foo' ('bar')) flatten )
>> But I wouldn't push either version to the Trunk now. I could imagine an
>> implementation which does the iteration with double dispatch and uses a
>> separate method for Array creation.
>
> OK. I didn't mean to suggest that #flatten was useful only for Arrays.
> They're just a convenient thing to use for examples: literal syntax. I
> hadn't really thought of collections of Strings. I'm not sure why
> double dispatch is particularly useful, unless you're thinking of
> being able to flatten arbitrary objects - turning a Person into
> {#name. 'Frank'}.

You can try merging Collections-klub.130.mcz into your image to see the 5 
very simple (one-liner) methods in our implementation.


Levente

>
>> Btw, I usually use #gather: when I need to flatten a level on a collection.
>> Deeper than two-levels collection structures are pretty rare in Smalltalk. I
>> guess this is why there's no #flatten yet.
>
> I was using a two-level collection, so I reckon I'll just remember
> #gather:. More convenient than using (foo collect: #something) inject:
> Array new into: #, all the time, which is what drove this
> implementation in the first place.
>
> frank
>
>> Levente
>>
>>>
>>> =============== Diff against Collections-ul.488 ===============
>>>
>>> Item was added:
>>> + ----- Method: SequenceableCollection>>flatten (in category 'copying')
>>> -----
>>> + flatten
>>> +       | recur stream |
>>> +       stream := WriteStream on: (Array new: self size). "A lower bound
>>> on the final stream count."
>>> +       recur := [:coll | coll
>>> +               do: [:each |
>>> +                       each isCollection
>>> +                               ifTrue: [recur value: each]
>>> +                               ifFalse: [stream nextPut: each]]].
>>> +       recur value: self.
>>> +       ^ stream contents.!
>>>
>>>
>>
>>
>>
>
>


More information about the Squeak-dev mailing list