on d9d1dfd help sign in
elk/core/Native/List.js
214 lines 4.2 kB history raw
1function nativeList(elm) {
3 function throwError(f) {
4 throw new Error("Function '" + f + "' expects a non-empty list!");
5 }
7 function toArray(xs) {
8 var out = [];
9 while (xs[0] === "Cons") {
10 out.push(xs[1]);
11 xs = xs[2];
12 }
13 return out;
14 }
16 function fromArray(arr) {
17 var out = ["Nil"];
18 for (var i = arr.length; i--; ) {
19 out = ["Cons", arr[i], out];
20 }
21 return out;
22 }
24 function head(v) { v[0] === "Nil" ? throwError('head') : return v[1]; }
25 function tail(v) { v[0] === "Nil" ? throwError('tail') : return v[2]; }
27 function last(xs) {
28 if (xs[0] === "Nil") { throwError('last'); }
29 var out = xs[1];
30 while (xs[0] === "Cons") {
31 out = xs[1];
32 xs = xs[2];
33 }
34 return out;
35 }
37 function map(f) { return function(xs) {
38 var arr = [];
39 while (xs[0] === "Cons") {
40 arr.push(f(xs[1]));
41 xs = xs[2];
42 }
43 return fromArray(arr);
44 }
45 }
47 function foldl(f) { return function(b) { return function(xs) {
48 var acc = b;
49 while (xs[0] === "Cons") {
50 acc = f(xs[1])(acc);
51 xs = xs[2];
52 }
53 return acc;
54 }
55 }
56 }
58 function foldr(f) { return function(b) { return function(xs) {
59 var arr = toArray(xs);
60 var acc = b;
61 for (var i = arr.length; i--; ) {
62 acc = f(arr[i])(acc);
63 }
64 return acc;
65 }
66 }
67 }
69 function foldl1(f) { return function(xs) {
70 xs[0] === "Nil" ? throwError('foldl1') : return foldl(f)(xs[1])(xs[2]);
71 }
72 }
74 function foldr1(f) { return function(xs) {
75 if (xs[0] === "Nil") { throwError('foldr1'); }
76 var arr = toArray(xs);
77 var acc = arr.pop();
78 for (var i = arr.length; i--; ) {
79 acc = f(arr[i])(acc);
80 }
81 return acc;
82 }
83 }
85 function scanl(f) { return function(b) { return function(xs) {
86 var arr = toArray(xs);
87 arr.unshift(b);
88 var len = arr.length;
89 for (var i = 1; i < len; ++i) {
90 arr[i] = f(arr[i])(arr[i-1]);
91 }
92 return fromArray(arr);
93 }
94 }
95 }
97 function scanl1(f) { return function(xs) {
98 xs[0] === "Nil" ? throwError('scanl1') : return scanl(f)(xs[1])(xs[2]);
99 }
100 }
102 function filter(pred) { return function(xs) {
103 var arr = [];
104 while (xs[0] === "Cons") {
105 if (pred(xs[1])) { arr.push(xs[1]); }
106 xs = xs[2];
107 }
108 return fromArray(arr);
109 }
110 }
112 function length(xs) {
113 var out = 0;
114 while (xs[0] === "Cons") {
115 out += 1;
116 xs = xs[2];
117 }
118 return out;
119 }
121 function reverse(xs) { return fromArray(toArray(xs).reverse()); }
123 function all(pred) { return function(xs) {
124 while (xs[0] === "Cons") {
125 if (!pred(xs[1])) return false;
126 xs = xs[2];
127 }
128 return true;
129 }
130 }
132 function any(pred) { return function(xs) {
133 while (xs[0] === "Cons") {
134 if (pred(xs[1])) return true;
135 xs = xs[2];
136 }
137 return false;
138 }
139 }
141 function zipWith(f) { return function(xs) { return function(ys) {
142 var arr = [];
143 while (xs[0] === "Cons" && ys[0] === "Cons") {
144 arr.push(f(xs[1])(ys[1]));
145 xs = xs[2];
146 ys = ys[2];
147 }
148 return fromArray(arr);
149 }
150 }
151 }
153 function zip(xs) { return function(ys) {
154 var arr = [];
155 while (xs[0] === "Cons" && ys[0] === "Cons") {
156 arr.push(["Tuple2",xs[1],ys[1]]);
157 xs = xs[2];
158 ys = ys[2];
159 }
160 return fromArray(arr);
161 }
162 }
164 function sort(xs) {
165 return fromArray(toArray(xs).sort(function(a,b) { return a - b}));
166 }
168 function take(n) { return function(xs) {
169 var arr = [];
170 while (xs[0] === "Cons" && n > 0) {
171 arr.push(xs[1]);
172 xs = xs[2];
173 --n;
174 }
175 return fromArray(arr);
176 }
177 }
179 function drop(n) { return function(xs) {
180 while (xs[0] === "Cons" && n > 0) {
181 xs = xs[2];
182 --n;
183 }
184 return xs;
185 }
186 }
188 function concatA(
190 elm.Native.List = {
191 head:head,
192 tail:tail,
193 last:last,
195 map:map,
196 foldl:foldl,
197 foldr:foldr,
199 foldl1:foldl1,
200 foldr1:foldr1,
201 scanl:scanl,
202 scanl1:scanl1,
203 filter:filter,
204 length:length,
205 reverse:reverse,
207 all:all,
208 any:any,
209 zipWith:zipWith,
210 zip:zip,
211 sort:sort,
212 take:take,
213 drop:drop};