on bbbd6ee help sign in
308 lines 6.4 kB history raw
2Elm.Native.List = function(elm) {
3 "use strict";
5 elm.Native = elm.Native || {};
6 if (elm.Native.List) return elm.Native.List;
8 var Utils = Elm.Native.Utils(elm);
10 var Nil = { ctor:'Nil' };
11 function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
13 function throwError(f) {
14 throw new Error("Function '" + f + "' expects a non-empty list!");
15 }
17 function toArray(xs) {
18 var out = [];
19 while (xs.ctor === "Cons") {
20 out.push(xs._0);
21 xs = xs._1;
22 }
23 return out;
24 }
26 function fromArray(arr) {
27 var out = Nil;
28 for (var i = arr.length; i--; ) {
29 out = Cons(arr[i], out);
30 }
31 return out;
32 }
34 function range(lo,hi) {
35 var lst = Nil;
36 if (lo <= hi) {
37 do { lst = Cons(hi,lst) } while (hi-->lo);
38 }
39 return lst
40 }
42 function append(xs,ys) {
43 if (typeof xs === "string") { return xs.concat(ys); }
44 if (xs.ctor === "Nil") { return ys; }
45 var root = Cons(xs._0. Nil);
46 var curr = root;
47 xs = xs._1;
48 while (xs.ctor==="Cons") {
49 curr._1 = Cons(xs._0. Nil);
50 xs = xs._1;
51 curr = curr._1;
52 }
53 curr._1 = ys;
54 return root;
55 }
57 function head(v) { return v.ctor === "Nil" ? throwError('head') : v._0; }
58 function tail(v) { return v.ctor === "Nil" ? throwError('tail') : v._1; }
60 function last(xs) {
61 if (xs.ctor === "Nil") { throwError('last'); }
62 var out = xs._0;
63 while (xs.ctor === "Cons") {
64 out = xs._0;
65 xs = xs._1;
66 }
67 return out;
68 }
70 function map(f, xs) {
71 var arr = [];
72 while (xs.ctor === "Cons") {
73 arr.push(f(xs._0));
74 xs = xs._1;
75 }
76 return fromArray(arr);
77 }
79 function foldl(f, b, xs) {
80 var acc = b;
81 while (xs.ctor === "Cons") {
82 acc = f(xs._0)(acc);
83 xs = xs._1;
84 }
85 return acc;
86 }
88 function foldr(f, b, xs) {
89 var arr = toArray(xs);
90 var acc = b;
91 for (var i = arr.length; i--; ) {
92 acc = f(arr[i])(acc);
93 }
94 return acc;
95 }
97 function foldl1(f, xs) {
98 return xs.ctor === "Nil" ? throwError('foldl1') : foldl(f, xs._0, xs._1);
99 }
101 function foldr1(f, xs) {
102 if (xs.ctor === "Nil") { throwError('foldr1'); }
103 var arr = toArray(xs);
104 var acc = arr.pop();
105 for (var i = arr.length; i--; ) {
106 acc = A2(f, arr[i], acc);
107 }
108 return acc;
109 }
111 function scanl(f, b, xs) {
112 var arr = toArray(xs);
113 arr.unshift(b);
114 var len = arr.length;
115 for (var i = 1; i < len; ++i) {
116 arr[i] = A2(f, arr[i], arr[i-1]);
117 }
118 return fromArray(arr);
119 }
121 function scanl1(f, xs) {
122 return xs.ctor === "Nil" ? throwError('scanl1') : scanl(f, xs._0, xs._1);
123 }
125 function filter(pred, xs) {
126 var arr = [];
127 while (xs.ctor === "Cons") {
128 if (pred(xs._0)) { arr.push(xs._0); }
129 xs = xs._1;
130 }
131 return fromArray(arr);
132 }
134 function length(xs) {
135 var out = 0;
136 while (xs.ctor === "Cons") {
137 out += 1;
138 xs = xs._1;
139 }
140 return out;
141 }
143 function member(x, xs) {
144 var out = 0;
145 while (xs.ctor === "Cons") {
146 if (Utils.eq(x,xs._0)) return true;
147 xs = xs._1;
148 }
149 return false;
150 }
152 function reverse(xs) { return fromArray(toArray(xs).reverse()); }
154 function concat(xss) {
155 if (xss.ctor === 'Nil') return xss;
156 var arr = toArray(xss);
157 var xs = arr[arr.length-1];
158 for (var i = arr.length-1; i--; ) {
159 xs = append(arr[i], xs);
160 }
161 return xs;
162 }
164 function all(pred, xs) {
165 while (xs.ctor === "Cons") {
166 if (!pred(xs._0)) return false;
167 xs = xs._1;
168 }
169 return true;
170 }
172 function any(pred, xs) {
173 while (xs.ctor === "Cons") {
174 if (pred(xs._0)) return true;
175 xs = xs._1;
176 }
177 return false;
178 }
180 function zipWith(f, xs, ys) {
181 var arr = [];
182 while (xs.ctor === "Cons" && ys.ctor === "Cons") {
183 arr.push(A2(f, xs._0, ys._0));
184 xs = xs._1;
185 ys = ys._1;
186 }
187 return fromArray(arr);
188 }
190 function zip(xs, ys) {
191 var arr = [];
192 while (xs.ctor === "Cons" && ys.ctor === "Cons") {
193 arr.push(Utils.Tuple2(xs._0, ys._0));
194 xs = xs._1;
195 ys = ys._1;
196 }
197 return fromArray(arr);
198 }
200 function sort(xs) {
201 function cmp(a,b) {
202 var ord = Utils.compare(a,b);
203 return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;
204 }
205 return fromArray(toArray(xs).sort(cmp));
206 }
208 function take(n, xs) {
209 var arr = [];
210 while (xs.ctor === "Cons" && n > 0) {
211 arr.push(xs._0);
212 xs = xs._1;
213 --n;
214 }
215 return fromArray(arr);
216 }
218 function drop(n, xs) {
219 while (xs.ctor === "Cons" && n > 0) {
220 xs = xs._1;
221 --n;
222 }
223 return xs;
224 }
226 function join(sep, xss) {
227 if (xss.ctor === 'Nil') return {ctor:'Nil'}
228 var s = toArray(sep);
229 var out = toArray(xss._0);
230 xss = xss._1;
231 while (xss.ctor === "Cons") {
232 out = out.concat(s, toArray(xss._0));
233 xss = xss._1;
234 }
235 return fromArray(out);
236 }
238 function split(sep, xs) {
239 var out = {ctor:'Nil'};
240 var array = toArray(xs);
241 var s = toArray(sep);
242 var slen = s.length;
243 if (slen === 0) {
244 for (var i = array.length; i--; ) {
245 out = Cons(Cons(array[i],Nil), out);
246 }
247 return out;
248 }
249 var temp = {ctor:'Nil'};
250 for (var i = array.length - slen; i >= 0; --i) {
251 var match = true;
252 for (var j = slen; j--; ) {
253 if (!Utils.eq(array[i+j], s[j])) { match = false; break; }
254 }
255 if (match) {
256 out = {ctor:'Cons', _0:temp, _1:out};
257 temp = {ctor:'Nil'};
258 i -= slen - 1;
259 } else {
260 temp = {ctor:'Cons', _0:array[i+j], _1:temp};
261 }
262 }
263 for (var j = slen-1; j--; ) {
264 temp = {ctor:'Cons', _0:array[j], _1:temp};
265 }
266 out = {ctor:'Cons', _0:temp, _1:out};
267 return out;
268 }
270 return elm.Native.List = {
271 Nil:Nil,
272 Cons:Cons,
273 toArray:toArray,
274 fromArray:fromArray,
275 range:range,
276 append:append,
278 head:head,
279 tail:tail,
280 last:last,
282 map:F2(map),
283 foldl:F3(foldl),
284 foldr:F3(foldr),
286 foldl1:F2(foldl1),
287 foldr1:F2(foldr1),
288 scanl:F3(scanl),
289 scanl1:F2(scanl1),
290 filter:F2(filter),
291 length:length,
292 member:member,
293 reverse:reverse,
294 concat:concat,
296 all:F2(all),
297 any:F2(any),
298 zipWith:F3(zipWith),
299 zip:F2(zip),
300 sort:sort,
301 take:F2(take),
302 drop:F2(drop),
304 join:F2(join),
305 split:F2(split)
306 };
308};