--- a/Array.st Thu Sep 11 14:58:27 2008 +0200
+++ b/Array.st Sun Sep 14 23:00:33 2008 +0200
@@ -278,7 +278,6 @@
"Modified: 23.4.1996 / 15:55:06 / cg"
! !
-
!Array methodsFor:'accessing'!
at:index
@@ -1272,6 +1271,38 @@
^ super keysAndValuesDo:aBlock
!
+modifyingTraverse:aBlock
+ "Evaluate aBlock for every element that is not an Array,
+ and recursively traverse Arrays.
+
+ aBlock may return the original element or a new element.
+ If a new element is returned, the element is changed to the new element."
+
+ self
+ keysAndValuesDo:[:eachIndex :eachElement |
+ eachElement isArray ifTrue:[
+ eachElement modifyingTraverse:aBlock
+ ] ifFalse:[
+ |newElement|
+
+ newElement := aBlock value:eachElement.
+ newElement ~~ eachElement ifTrue:[
+ self at:eachIndex put:newElement.
+ ].
+ ]
+ ].
+
+ "
+ example: replace all elements which are 10 with: 'changed'
+
+ #(1 2 (3 (4 5 (6 7) 8) 9 10) 11 (12 (13)) 14) copy
+ modifyingTraverse:[:el |
+ el = 10 ifTrue:['changed'] ifFalse:[el]
+ ];
+ inspect
+ "
+!
+
reverseDo:aBlock
"evaluate the argument, aBlock for each element in the collection in reverse order.
- reimplemented for speed"
@@ -2519,5 +2550,5 @@
!Array class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Array.st,v 1.143 2007-11-21 10:10:11 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Array.st,v 1.144 2008-09-14 21:00:33 stefan Exp $'
! !