New: #modifyingTraverse:
authorStefan Vogel <sv@exept.de>
Sun, 14 Sep 2008 23:00:33 +0200
changeset 11167 883813e7d746
parent 11166 52c2ccfc0d4c
child 11168 44fef5d29484
New: #modifyingTraverse:
Array.st
--- 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 $'
 ! !