on master help sign in
Add native to-/fromJSArray
commit2cbb9b4b0c484c3d132a8591471711fc0bdf3e7d authorChristian Widera <xash@posteo.de> dateTue 15 Apr 2014, 23:39 (13 years ago) parent97c9475
1 file changed+45−2
libraries/Native/Array.js+45−2
libraries/Native/Array.js+45−2
@@ -1,4 +1,4 @@
1−Elm.Native.Array = {};
1+Elm.Native.Array = {};
22Elm.Native.Array.make = function(elm) {
33 elm.Native = elm.Native || {};
44 elm.Native.Array = elm.Native.Array || {};
@@ -571,6 +571,46 @@ Elm.Native.Array.make = function(elm) {
571571 , lengths:[length(a), length(a) + length(b)] };
572572 }
573573
574+ function toJSArray(a) {
575+ var jsArray = new Array(length(a));
576+ toJSArray_(jsArray, 0, a);
577+ return jsArray;
578+ }
579+
580+ function toJSArray_(jsArray, i, a) {
581+ for (var t = 0; t < a.table.length; t++) {
582+ if (a.height == 0) {
583+ jsArray[i + t] = a.table[t];
584+ } else {
585+ var inc = t == 0 ? 0 : a.lengths[t - 1];
586+ toJSArray_(jsArray, i + inc, a.table[t]);
587+ }
588+ }
589+ }
590+
591+ function fromJSArray(jsArray) {
592+ if (jsArray.length == 0) { return empty; }
593+ var h = Math.floor(Math.log(jsArray.length) / Math.log(M));
594+ return fromJSArray_(jsArray, h, 0, jsArray.length);
595+ }
596+
597+ function fromJSArray_(jsArray, h, from, to) {
598+ if (h == 0) {
599+ return { ctor:"_Array", height:0
600+ , table:jsArray.slice(from, to) };
601+ }
602+
603+ var step = Math.pow(M, h);
604+ var table = new Array(Math.ceil((to - from) / step));
605+ var lengths = new Array(table.length);
606+ for (var i = 0; i < table.length; i++) {
607+ table[i] = fromJSArray_( jsArray, h - 1, from + (i * step)
608+ , Math.min(from + ((i + 1) * step), to));
609+ lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0);
610+ }
611+ return { ctor:"_Array", height:h, table:table, lengths:lengths };
612+ }
613+
574614 Elm.Native.Array.values = {
575615 empty:empty,
576616 fromList:fromList,
@@ -585,7 +625,10 @@ Elm.Native.Array.make = function(elm) {
585625 indexedMap:F2(indexedMap),
586626 foldl:F3(foldl),
587627 foldr:F3(foldr),
588− length:length
628+ length:length,
629+
630+ toJSArray:toJSArray,
631+ fromJSArray:fromJSArray
589632 };
590633
591634 return elm.Native.Array.values = Elm.Native.Array.values;