2Elm.Native.List.make = function(elm) {
3 elm.Native = elm.Native || {};
4 elm.Native.List = elm.Native.List || {};
5 if (elm.Native.List.values) return elm.Native.List.values;
6 if ('values' in Elm.Native.List)
7 return elm.Native.List.values = Elm.Native.List.values;
9 var Utils = Elm.Native.Utils.make(elm);
11 // TODO: Improve Nil handling
12 // We can change places like: if (xs.ctor === '[]') ... to if (xs === Nil) ...
13 // but only if we're confident Nil can only be defined once.
14 // Currently (27Mar2013) each module can have different instantiations, so multiple Nil objects can exist
15 // (and if they're used interchangeably then direct object comparison fails where ctor doesn't).
16 // So, this can only be fixed when modules initialisation is also fixed.
17 // The performance overhead of the .ctor calls is 5-10% according to jsperf (depending on fn + list size)
20 var Nil = { ctor:'[]' };
22 // using freeze for every cons would be nice but is a huge (9x on firefox 19)
23 // performance penalty
24 function Cons(hd,tl) { return { ctor:"::", _0:hd, _1:tl }; }
26 function throwError(f) {
27 throw new Error("Function '" + f + "' expects a non-empty list!");
30 function toArray(xs) {
32 while (xs.ctor !== '[]') {
39 function fromArray(arr) {
41 for (var i = arr.length; i--; ) {
42 out = Cons(arr[i], out);
47 function range(lo,hi) {
50 do { lst = Cons(hi,lst) } while (hi-->lo);
55 function append(xs,ys) {
57 if (xs.text || ys.text) {
58 return Utils.txt(Utils.makeText(xs) + Utils.makeText(ys));
62 if (typeof xs === "string") return xs + ys;
65 if (xs.ctor === '[]') { return ys; }
66 var root = Cons(xs._0, Nil);
69 while (xs.ctor !== '[]') {
70 curr._1 = Cons(xs._0, Nil);
78 function head(v) { return v.ctor === '[]' ? throwError('head') : v._0; }
79 function tail(v) { return v.ctor === '[]' ? throwError('tail') : v._1; }
82 if (xs.ctor === '[]') { throwError('last'); }
84 while (xs.ctor !== '[]') {
93 while (xs.ctor !== '[]') {
97 return fromArray(arr);
100 // f defined similarly for both foldl and foldr (NB: different from Haskell)
101 // ie, foldl : (a -> b -> b) -> b -> [a] -> b
102 function foldl(f, b, xs) {
104 while (xs.ctor !== '[]') {
105 acc = A2(f, xs._0, acc);
111 function foldr(f, b, xs) {
112 var arr = toArray(xs);
114 for (var i = arr.length; i--; ) {
115 acc = A2(f, arr[i], acc);
120 function foldl1(f, xs) {
121 return xs.ctor === '[]' ? throwError('foldl1') : foldl(f, xs._0, xs._1);
124 function foldr1(f, xs) {
125 if (xs.ctor === '[]') { throwError('foldr1'); }
126 var arr = toArray(xs);
128 for (var i = arr.length; i--; ) {
129 acc = A2(f, arr[i], acc);
134 function scanl(f, b, xs) {
135 var arr = toArray(xs);
137 var len = arr.length;
138 for (var i = 1; i < len; ++i) {
139 arr[i] = A2(f, arr[i], arr[i-1]);
141 return fromArray(arr);
144 function scanl1(f, xs) {
145 return xs.ctor === '[]' ? throwError('scanl1') : scanl(f, xs._0, xs._1);
148 function filter(pred, xs) {
150 while (xs.ctor !== '[]') {
151 if (pred(xs._0)) { arr.push(xs._0); }
154 return fromArray(arr);
157 function length(xs) {
159 while (xs.ctor !== '[]') {
166 function member(x, xs) {
167 while (xs.ctor !== '[]') {
168 if (Utils.eq(x,xs._0)) return true;
174 function reverse(xs) { return fromArray(toArray(xs).reverse()); }
176 function concat(xss) {
177 if (xss.ctor === '[]') return xss;
178 var arr = toArray(xss);
179 var xs = arr[arr.length-1];
180 for (var i = arr.length-1; i--; ) {
181 xs = append(arr[i], xs);
186 function all(pred, xs) {
187 while (xs.ctor !== '[]') {
188 if (!pred(xs._0)) return false;
194 function any(pred, xs) {
195 while (xs.ctor !== '[]') {
196 if (pred(xs._0)) return true;
202 function zipWith(f, xs, ys) {
204 while (xs.ctor !== '[]' && ys.ctor !== '[]') {
205 arr.push(A2(f, xs._0, ys._0));
209 return fromArray(arr);
212 function zip(xs, ys) {
214 while (xs.ctor !== '[]' && ys.ctor !== '[]') {
215 arr.push(Utils.Tuple2(xs._0, ys._0));
219 return fromArray(arr);
223 return fromArray(toArray(xs).sort(Utils.cmp));
226 function sortBy(f, xs) {
227 return fromArray(toArray(xs).sort(function(a,b){
228 return Utils.cmp(f(a), f(b));
232 function sortWith(f, xs) {
233 return fromArray(toArray(xs).sort(function(a,b){
234 var ord = f(a)(b).ctor;
235 return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;
239 function nth(xs, n) {
240 return toArray(xs)[n];
243 function take(n, xs) {
245 while (xs.ctor !== '[]' && n > 0) {
250 return fromArray(arr);
253 function drop(n, xs) {
254 while (xs.ctor !== '[]' && n > 0) {
261 function repeat(n, x) {
265 if (n & 1) arr = arr.concat(pattern);
266 n >>= 1, pattern = pattern.concat(pattern);
268 return fromArray(arr);
271 function join(sep, xss) {
273 sep = Utils.makeText(sep);
275 for (var i = xss.length; i--; ) {
276 xss[i] = Utils.makeText(xss[i]);
278 return Utils.txt(xss.join(sep));
280 if (typeof sep === 'string') return toArray(xss).join(sep);
281 if (xss.ctor === '[]') return Nil;
282 var s = toArray(sep);
283 var out = toArray(xss._0);
285 while (xss.ctor !== '[]') {
286 out = out.concat(s, toArray(xss._0));
289 return fromArray(out);
292 Elm.Native.List.values = {
325 sortWith:F2(sortWith),
333 return elm.Native.List.values = Elm.Native.List.values;
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list