on master help sign in
Merge pull request #649 from Xashili/patch-1

Fix folds

commit5d39e64db1ea77f8630b5e15ac91f3e80bf9a714 authorEvan Czaplicki <info@elm-lang.org> dateMon 9 Jun 2014, 19:07 (12 years ago) parentb7aeae48a1b6cc
2 files changed+19−5
libraries/Native/Array.js+16−4 tests/libraries/Test/Array.elm+3−1
libraries/Native/Array.js+16−4
@@ -255,15 +255,27 @@ Elm.Native.Array.make = function(elm) {
255255 }
256256
257257 function foldl(f, b, a) {
258− for (var i = 0; i < a.table.length; i++) {
259− b = A2(f, a.height == 0 ? a.table[i] : foldl(f, b, a.table[i]), b);
258+ if (a.height == 0) {
259+ for (var i = 0; i < a.table.length; i++) {
260+ b = A2(f, a.table[i], b);
261+ }
262+ } else {
263+ for (var i = 0; i < a.table.length; i++) {
264+ b = foldl(f, b, a.table[i]);
265+ }
260266 }
261267 return b;
262268 }
263269
264270 function foldr(f, b, a) {
265− for (var i = a.table.length; i--; ) {
266− b = A2(f, a.height == 0 ? a.table[i] : foldr(f, b, a.table[i]), b);
271+ if (a.height == 0) {
272+ for (var i = a.table.length; i--; ) {
273+ b = A2(f, a.table[i], b);
274+ }
275+ } else {
276+ for (var i = a.table.length; i--; ) {
277+ b = foldl(f, b, a.table[i]);
278+ }
267279 }
268280 return b;
269281 }
tests/libraries/Test/Array.elm+3−1
@@ -48,9 +48,11 @@ tests =
4848 [ test "map" <| assertEqual (Array.fromList [1,2,3]) (Array.map sqrt (Array.fromList [1,4,9]))
4949 , test "indexedMap 1" <| assertEqual (Array.fromList [0,5,10]) (Array.indexedMap (*) (Array.fromList [5,5,5]))
5050 , test "indexedMap 2" <| assertEqual [0..99] (Array.toList (Array.indexedMap always (Array.repeat 100 0)))
51− , test "foldl" <| assertEqual [3,2,1] (Array.foldl (::) [] (Array.fromList [1,2,3]))
51+ , test "foldl 1" <| assertEqual [3,2,1] (Array.foldl (::) [] (Array.fromList [1,2,3]))
52+ , test "foldl 2" <| assertEqual 33 (Array.foldl (+) 0 (Array.repeat 33 1))
5253 , test "foldr 1" <| assertEqual 15 (Array.foldr (+) 0 (Array.repeat 3 5))
5354 , test "foldr 2" <| assertEqual [1,2,3] (Array.foldr (::) [] (Array.fromList [1,2,3]))
55+ , test "foldr 3" <| assertEqual 53 (Array.foldr (-) 54 (Array.fromList [10,11]))
5456 , test "filter" <| assertEqual (Array.fromList [2,4,6]) (Array.filter (\x -> x `mod` 2 == 0) (Array.fromList [1..6]))
5557 ]
5658 nativeTests = suite "Conversion to JS Arrays"