#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