on 263bf1c help sign in
261 lines 5.2 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 return elm.Native.List = {
227 Nil:Nil,
228 Cons:Cons,
229 toArray:toArray,
230 fromArray:fromArray,
231 range:range,
232 append:append,
234 head:head,
235 tail:tail,
236 last:last,
238 map:F2(map),
239 foldl:F3(foldl),
240 foldr:F3(foldr),
242 foldl1:F2(foldl1),
243 foldr1:F2(foldr1),
244 scanl:F3(scanl),
245 scanl1:F2(scanl1),
246 filter:F2(filter),
247 length:length,
248 member:member,
249 reverse:reverse,
250 concat:concat,
252 all:F2(all),
253 any:F2(any),
254 zipWith:F3(zipWith),
255 zip:F2(zip),
256 sort:sort,
257 take:F2(take),
258 drop:F2(drop)
259 };
261};