#flatten (Re: [squeak-dev] The Inbox: Collections-fbs.489.mcz)
Levente Uzonyi
leves at elte.hu
Mon Aug 20 20:54:55 UTC 2012
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.
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.
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
|