Issue 3234 in pharo: fold: reduce: Merge

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Issue 3234 in pharo: fold: reduce: Merge

pharo
Status: FixedWaitingToBePharoed
Owner: stephane.ducasse
Labels: Type-Squeak

New issue 3234 by stephane.ducasse: fold: reduce: Merge
http://code.google.com/p/pharo/issues/detail?id=3234

I imagine that reduce: and fold: are not the same in pharo so we should pay  
attention.


Name: Collections-ul.403
Author: ul
Time: 7 November 2010, 1:55:55.898 am
UUID: 7f81b384-8004-cd44-81e0-9b294d999c8a
Ancestors: Collections-ul.402

- merged Collection's #fold: and #reduce: (it's a bit faster than the  
original versions :))


Item was changed:
  ----- Method: Collection>>fold: (in category 'enumerating') -----
  fold: binaryBlock
        "Evaluate the block with the first two elements of the receiver,
         then with the result of the first evaluation and the next element,
         and so on.  Answer the result of the final evaluation. If the  
receiver
         is empty, raise an error. If the receiver has a single element,  
answer
         that element."
        "#('if' 'it' 'is' 'to' 'be' 'it' 'is' 'up' 'to' 'me') fold: [:a :b |  
a, ' ', b]"

+       ^self reduce: binaryBlock!
-       | firstValue nextValue |
-       firstValue := nextValue := Object new. "something that can't be in  
the receiver"
-       self do:
-               [:each |
-               nextValue := firstValue == nextValue
-                                               ifTrue: [each]
-                                               ifFalse: [binaryBlock  
value: nextValue value: each]].
-       ^nextValue == firstValue
-               ifTrue: [self errorEmptyCollection]
-               ifFalse: [nextValue]!

Item was changed:
  ----- Method: Collection>>reduce: (in category 'enumerating') -----
  reduce: binaryBlock
        "Apply the argument, binaryBlock cumulatively to the elements of the  
receiver.
        For sequenceable collections the elements will be used in order, for  
unordered
        collections the order is unspecified."

        | first nextValue |
-       self emptyCheck.
        first := true.
+       self do: [ :each |
+               first
+                       ifTrue: [ nextValue := each. first := false ]
+                       ifFalse: [ nextValue := binaryBlock value:  
nextValue value: each ] ].
+       first ifTrue: [ self errorEmptyCollection ].
-       self do:[:each|
-               first ifTrue:[nextValue := each. first := false]
-                       ifFalse:[nextValue := binaryBlock value: nextValue  
value: each]].
        ^nextValue!