on master help sign in
List.js minor bugfixes (followup)

put foldl back as was + add type sig. to indicate why replace use of xs.ctor with direct comparison against Nil. This means the ctor field is no longer required (which is nice). move .ctor in stor to the actual variable (doh)

commit93afe4cea8b4ac043df4b0dfb4f3ab3e28b4c784 authorngunn <ngunn@computationalthinking.org.uk> dateMon 25 Mar 2013, 20:25 (14 years ago) parent441e907
1 file changed+29−27
libraries/Native/List.js+29−27
libraries/Native/List.js+29−27
@@ -20,7 +20,7 @@ Elm.Native.List = function(elm) {
2020
2121 function toArray(xs) {
2222 var out = [];
23− while (xs.ctor === "Cons") {
23+ while (xs !== Nil) {
2424 out.push(xs._0);
2525 xs = xs._1;
2626 }
@@ -45,11 +45,11 @@ Elm.Native.List = function(elm) {
4545
4646 function append(xs,ys) {
4747 if (typeof xs === "string") { return xs.concat(ys); }
48− if (xs.ctor === "Nil") { return ys; }
48+ if (xs === Nil) { return ys; }
4949 var root = Cons(xs._0. Nil);
5050 var curr = root;
5151 xs = xs._1;
52− while (xs.ctor==="Cons") {
52+ while (xs !== Nil) {
5353 curr._1 = Cons(xs._0. Nil);
5454 xs = xs._1;
5555 curr = curr._1;
@@ -58,13 +58,13 @@ Elm.Native.List = function(elm) {
5858 return root;
5959 }
6060
61− function head(v) { return v.ctor === "Nil" ? throwError('head') : v._0; }
62− function tail(v) { return v.ctor === "Nil" ? throwError('tail') : v._1; }
61+ function head(v) { return v === Nil ? throwError('head') : v._0; }
62+ function tail(v) { return v === Nil ? throwError('tail') : v._1; }
6363
6464 function last(xs) {
65− if (xs.ctor === "Nil") { throwError('last'); }
65+ if (xs === Nil) { throwError('last'); }
6666 var out = xs._0;
67− while (xs.ctor === "Cons") {
67+ while (xs !== Nil) {
6868 out = xs._0;
6969 xs = xs._1;
7070 }
@@ -73,17 +73,19 @@ Elm.Native.List = function(elm) {
7373
7474 function map(f, xs) {
7575 var arr = [];
76− while (xs.ctor === "Cons") {
76+ while (xs !== Nil) {
7777 arr.push(f(xs._0));
7878 xs = xs._1;
7979 }
8080 return fromArray(arr);
8181 }
8282
83+ // f defined similarly for both foldl and foldr (NB: different from Haskell)
84+ // ie, foldl :: (a -> b -> b) -> b -> [a] -> b
8385 function foldl(f, b, xs) {
8486 var acc = b;
85− while (xs.ctor === "Cons") {
86− acc = A2(f, acc, xs._0);
87+ while (xs !== Nil) {
88+ acc = A2(f, xs._0, acc);
8789 xs = xs._1;
8890 }
8991 return acc;
@@ -99,11 +101,11 @@ Elm.Native.List = function(elm) {
99101 }
100102
101103 function foldl1(f, xs) {
102− return xs.ctor === "Nil" ? throwError('foldl1') : foldl(f, xs._0, xs._1);
104+ return xs === Nil ? throwError('foldl1') : foldl(f, xs._0, xs._1);
103105 }
104106
105107 function foldr1(f, xs) {
106− if (xs.ctor === "Nil") { throwError('foldr1'); }
108+ if (xs === Nil) { throwError('foldr1'); }
107109 var arr = toArray(xs);
108110 var acc = arr.pop();
109111 for (var i = arr.length; i--; ) {
@@ -123,12 +125,12 @@ Elm.Native.List = function(elm) {
123125 }
124126
125127 function scanl1(f, xs) {
126− return xs.ctor === "Nil" ? throwError('scanl1') : scanl(f, xs._0, xs._1);
128+ return xs === Nil ? throwError('scanl1') : scanl(f, xs._0, xs._1);
127129 }
128130
129131 function filter(pred, xs) {
130132 var arr = [];
131− while (xs.ctor === "Cons") {
133+ while (xs !== Nil) {
132134 if (pred(xs._0)) { arr.push(xs._0); }
133135 xs = xs._1;
134136 }
@@ -137,7 +139,7 @@ Elm.Native.List = function(elm) {
137139
138140 function length(xs) {
139141 var out = 0;
140− while (xs.ctor === "Cons") {
142+ while (xs !== Nil) {
141143 out += 1;
142144 xs = xs._1;
143145 }
@@ -145,7 +147,7 @@ Elm.Native.List = function(elm) {
145147 }
146148
147149 function member(x, xs) {
148− while (xs.ctor === "Cons") {
150+ while (xs !== Nil) {
149151 if (Utils.eq(x,xs._0)) return true;
150152 xs = xs._1;
151153 }
@@ -155,7 +157,7 @@ Elm.Native.List = function(elm) {
155157 function reverse(xs) { return fromArray(toArray(xs).reverse()); }
156158
157159 function concat(xss) {
158− if (xss.ctor === 'Nil') return xss;
160+ if (xss === Nil) return xss;
159161 var arr = toArray(xss);
160162 var xs = arr[arr.length-1];
161163 for (var i = arr.length-1; i--; ) {
@@ -165,7 +167,7 @@ Elm.Native.List = function(elm) {
165167 }
166168
167169 function all(pred, xs) {
168− while (xs.ctor === "Cons") {
170+ while (xs !== Nil) {
169171 if (!pred(xs._0)) return false;
170172 xs = xs._1;
171173 }
@@ -173,7 +175,7 @@ Elm.Native.List = function(elm) {
173175 }
174176
175177 function any(pred, xs) {
176− while (xs.ctor === "Cons") {
178+ while (xs !== Nil) {
177179 if (pred(xs._0)) return true;
178180 xs = xs._1;
179181 }
@@ -182,7 +184,7 @@ Elm.Native.List = function(elm) {
182184
183185 function zipWith(f, xs, ys) {
184186 var arr = [];
185− while (xs.ctor === "Cons" && ys.ctor === "Cons") {
187+ while (xs !== Nil && ys !== Nil) {
186188 arr.push(A2(f, xs._0, ys._0));
187189 xs = xs._1;
188190 ys = ys._1;
@@ -192,7 +194,7 @@ Elm.Native.List = function(elm) {
192194
193195 function zip(xs, ys) {
194196 var arr = [];
195− while (xs.ctor === "Cons" && ys.ctor === "Cons") {
197+ while (xs !== Nil && ys !== Nil) {
196198 arr.push(Utils.Tuple2(xs._0, ys._0));
197199 xs = xs._1;
198200 ys = ys._1;
@@ -202,15 +204,15 @@ Elm.Native.List = function(elm) {
202204
203205 function sort(xs) {
204206 function cmp(a,b) {
205− var ord = Utils.compare(a,b);
206− return ord.ctor === 'EQ' ? 0 : ord.ctor === 'LT' ? -1 : 1;
207+ var ord = Utils.compare(a,b).ctor;
208+ return ord=== 'EQ' ? 0 : ord === 'LT' ? -1 : 1;
207209 }
208210 return fromArray(toArray(xs).sort(cmp));
209211 }
210212
211213 function take(n, xs) {
212214 var arr = [];
213− while (xs.ctor === "Cons" && n > 0) {
215+ while (xs !== Nil && n > 0) {
214216 arr.push(xs._0);
215217 xs = xs._1;
216218 --n;
@@ -219,7 +221,7 @@ Elm.Native.List = function(elm) {
219221 }
220222
221223 function drop(n, xs) {
222− while (xs.ctor === "Cons" && n > 0) {
224+ while (xs !== Nil && n > 0) {
223225 xs = xs._1;
224226 --n;
225227 }
@@ -227,11 +229,11 @@ Elm.Native.List = function(elm) {
227229 }
228230
229231 function join(sep, xss) {
230− if (xss.ctor === 'Nil') return Nil;
232+ if (xss === Nil) return Nil;
231233 var s = toArray(sep);
232234 var out = toArray(xss._0);
233235 xss = xss._1;
234− while (xss.ctor === "Cons") {
236+ while (xss !== Nil) {
235237 out = out.concat(s, toArray(xss._0));
236238 xss = xss._1;
237239 }