on d53cecf help sign in
elk/core/Native/List.js
216 lines 4.3 kB history raw
1(function() {
2 "use strict";
4 var Nil = { ctor:'Nil' };
5 function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
7 function throwError(f) {
8 throw new Error("Function '" + f + "' expects a non-empty list!");
9 }
11 function toArray(xs) {
12 var out = [];
13 while (xs.ctor === "Cons") {
14 out.push(xs._0);
15 xs = xs._1;
16 }
17 return out;
18 }
20 function fromArray(arr) {
21 var out = Nil;
22 for (var i = arr.length; i--; ) {
23 out = Cons(arr[i], out);
24 }
25 return out;
26 }
28 function head(v) { v.ctor === "Nil" ? throwError('head') : return v._0; }
29 function tail(v) { v.ctor === "Nil" ? throwError('tail') : return v._1; }
31 function last(xs) {
32 if (xs.ctor === "Nil") { throwError('last'); }
33 var out = xs._0;
34 while (xs.ctor === "Cons") {
35 out = xs._0;
36 xs = xs._1;
37 }
38 return out;
39 }
41 function map(f) { return function(xs) {
42 var arr = [];
43 while (xs.ctor === "Cons") {
44 arr.push(f(xs._0));
45 xs = xs._1;
46 }
47 return fromArray(arr);
48 }
49 }
51 function foldl(f) { return function(b) { return function(xs) {
52 var acc = b;
53 while (xs.ctor === "Cons") {
54 acc = f(xs._0)(acc);
55 xs = xs._1;
56 }
57 return acc;
58 }
59 }
60 }
62 function foldr(f) { return function(b) { return function(xs) {
63 var arr = toArray(xs);
64 var acc = b;
65 for (var i = arr.length; i--; ) {
66 acc = f(arr[i])(acc);
67 }
68 return acc;
69 }
70 }
71 }
73 function foldl1(f) { return function(xs) {
74 xs.ctor === "Nil" ? throwError('foldl1') : return foldl(f)(xs._0)(xs._1);
75 }
76 }
78 function foldr1(f) { return function(xs) {
79 if (xs.ctor === "Nil") { throwError('foldr1'); }
80 var arr = toArray(xs);
81 var acc = arr.pop();
82 for (var i = arr.length; i--; ) {
83 acc = f(arr[i])(acc);
84 }
85 return acc;
86 }
87 }
89 function scanl(f) { return function(b) { return function(xs) {
90 var arr = toArray(xs);
91 arr.unshift(b);
92 var len = arr.length;
93 for (var i = 1; i < len; ++i) {
94 arr[i] = f(arr[i])(arr[i-1]);
95 }
96 return fromArray(arr);
97 }
98 }
99 }
101 function scanl1(f) { return function(xs) {
102 xs.ctor === "Nil" ? throwError('scanl1') : return scanl(f)(xs._0)(xs._1);
103 }
104 }
106 function filter(pred) { return function(xs) {
107 var arr = [];
108 while (xs.ctor === "Cons") {
109 if (pred(xs._0)) { arr.push(xs._0); }
110 xs = xs._1;
111 }
112 return fromArray(arr);
113 }
114 }
116 function length(xs) {
117 var out = 0;
118 while (xs.ctor === "Cons") {
119 out += 1;
120 xs = xs._1;
121 }
122 return out;
123 }
125 function reverse(xs) { return fromArray(toArray(xs).reverse()); }
127 function all(pred) { return function(xs) {
128 while (xs.ctor === "Cons") {
129 if (!pred(xs._0)) return false;
130 xs = xs._1;
131 }
132 return true;
133 }
134 }
136 function any(pred) { return function(xs) {
137 while (xs.ctor === "Cons") {
138 if (pred(xs._0)) return true;
139 xs = xs._1;
140 }
141 return false;
142 }
143 }
145 function zipWith(f) { return function(xs) { return function(ys) {
146 var arr = [];
147 while (xs.ctor === "Cons" && ys.ctor === "Cons") {
148 arr.push(f(xs._0)(ys._0));
149 xs = xs._1;
150 ys = ys._1;
151 }
152 return fromArray(arr);
153 }
154 }
155 }
157 function zip(xs) { return function(ys) {
158 var arr = [];
159 while (xs.ctor === "Cons" && ys.ctor === "Cons") {
160 arr.push(["Tuple2",xs._0,ys._0]);
161 xs = xs._1;
162 ys = ys._1;
163 }
164 return fromArray(arr);
165 }
166 }
168 function sort(xs) {
169 return fromArray(toArray(xs).sort(function(a,b) { return a - b}));
170 }
172 function take(n) { return function(xs) {
173 var arr = [];
174 while (xs.ctor === "Cons" && n > 0) {
175 arr.push(xs._0);
176 xs = xs._1;
177 --n;
178 }
179 return fromArray(arr);
180 }
181 }
183 function drop(n) { return function(xs) {
184 while (xs.ctor === "Cons" && n > 0) {
185 xs = xs._1;
186 --n;
187 }
188 return xs;
189 }
190 }
192 Elm.Native.List = {
193 head:head,
194 tail:tail,
195 last:last,
197 map:map,
198 foldl:foldl,
199 foldr:foldr,
201 foldl1:foldl1,
202 foldr1:foldr1,
203 scanl:scanl,
204 scanl1:scanl1,
205 filter:filter,
206 length:length,
207 reverse:reverse,
209 all:all,
210 any:any,
211 zipWith:zipWith,
212 zip:zip,
213 sort:sort,
214 take:take,
215 drop:drop};
216}());