on master help sign in
Merge branch 'pr/603'
cede92fEvan Czaplicki
libraries/Native/Array.js+45−2
@@ -1,4 +1,4 @@
1−Elm.Native.Array = {};
1+Elm.Native.Array = {};
2Elm.Native.Array.make = function(elm) {
2Elm.Native.Array.make = function(elm) {
3 elm.Native = elm.Native || {};
3 elm.Native = elm.Native || {};
4 elm.Native.Array = elm.Native.Array || {};
4 elm.Native.Array = elm.Native.Array || {};
@@ -576,6 +576,46 @@ Elm.Native.Array.make = function(elm) {
576 , lengths:[length(a), length(a) + length(b)] };
576 , lengths:[length(a), length(a) + length(b)] };
577 }
577 }
578
578
579+ function toJSArray(a) {
580+ var jsArray = new Array(length(a));
581+ toJSArray_(jsArray, 0, a);
582+ return jsArray;
583+ }
584+
585+ function toJSArray_(jsArray, i, a) {
586+ for (var t = 0; t < a.table.length; t++) {
587+ if (a.height == 0) {
588+ jsArray[i + t] = a.table[t];
589+ } else {
590+ var inc = t == 0 ? 0 : a.lengths[t - 1];
591+ toJSArray_(jsArray, i + inc, a.table[t]);
592+ }
593+ }
594+ }
595+
596+ function fromJSArray(jsArray) {
597+ if (jsArray.length == 0) { return empty; }
598+ var h = Math.floor(Math.log(jsArray.length) / Math.log(M));
599+ return fromJSArray_(jsArray, h, 0, jsArray.length);
600+ }
601+
602+ function fromJSArray_(jsArray, h, from, to) {
603+ if (h == 0) {
604+ return { ctor:"_Array", height:0
605+ , table:jsArray.slice(from, to) };
606+ }
607+
608+ var step = Math.pow(M, h);
609+ var table = new Array(Math.ceil((to - from) / step));
610+ var lengths = new Array(table.length);
611+ for (var i = 0; i < table.length; i++) {
612+ table[i] = fromJSArray_( jsArray, h - 1, from + (i * step)
613+ , Math.min(from + ((i + 1) * step), to));
614+ lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0);
615+ }
616+ return { ctor:"_Array", height:h, table:table, lengths:lengths };
617+ }
618+
579 Elm.Native.Array.values = {
619 Elm.Native.Array.values = {
580 empty:empty,
620 empty:empty,
581 fromList:fromList,
621 fromList:fromList,
@@ -590,7 +630,10 @@ Elm.Native.Array.make = function(elm) {
590 indexedMap:F2(indexedMap),
630 indexedMap:F2(indexedMap),
591 foldl:F3(foldl),
631 foldl:F3(foldl),
592 foldr:F3(foldr),
632 foldr:F3(foldr),
593− length:length
633+ length:length,
634+
635+ toJSArray:toJSArray,
636+ fromJSArray:fromJSArray
594 };
637 };
595
638
596 return elm.Native.Array.values = Elm.Native.Array.values;
639 return elm.Native.Array.values = Elm.Native.Array.values;
tests/elm/Test/Array.elm+5−1
@@ -2,6 +2,7 @@ module Test.Array (tests) where
2
2
3import List
3import List
4import Array
4import Array
5+import Native.Array
5
6
6import ElmTest.Assertion (..)
7import ElmTest.Assertion (..)
7import ElmTest.Test (..)
8import ElmTest.Test (..)
@@ -50,5 +51,8 @@ tests =
50 , test "foldr 2" <| assertEqual (Array.foldr (::) [] (Array.fromList [1,2,3])) [1,2,3]
51 , test "foldr 2" <| assertEqual (Array.foldr (::) [] (Array.fromList [1,2,3])) [1,2,3]
51 , test "filter" <| assertEqual (Array.filter (\x -> x `mod` 2 == 0) (Array.fromList [1..6])) (Array.fromList [2,4,6])
52 , test "filter" <| assertEqual (Array.filter (\x -> x `mod` 2 == 0) (Array.fromList [1..6])) (Array.fromList [2,4,6])
52 ]
53 ]
54+ nativeTests =
55+ [ test "jsArrays" <| assertEqual (Array.fromList [1..1100]) (Native.Array.fromJSArray (Native.Array.toJSArray (Array.fromList [1..1100])))
56+ ]
53 in
57 in
54− suite "Array Tests" [creationTests, basicsTests, getAndSetTests, takingArraysApartTests, mappingAndFoldingTests]
58+ suite "Array Tests" [creationTests, basicsTests, getAndSetTests, takingArraysApartTests, mappingAndFoldingTests, nativeTests]