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