1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/mochitest/tests/MochiKit-1.4.2/MochiKit/Iter.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,844 @@ 1.4 +/*** 1.5 + 1.6 +MochiKit.Iter 1.4.2 1.7 + 1.8 +See <http://mochikit.com/> for documentation, downloads, license, etc. 1.9 + 1.10 +(c) 2005 Bob Ippolito. All rights Reserved. 1.11 + 1.12 +***/ 1.13 + 1.14 +MochiKit.Base._deps('Iter', ['Base']); 1.15 + 1.16 +MochiKit.Iter.NAME = "MochiKit.Iter"; 1.17 +MochiKit.Iter.VERSION = "1.4.2"; 1.18 +MochiKit.Base.update(MochiKit.Iter, { 1.19 + __repr__: function () { 1.20 + return "[" + this.NAME + " " + this.VERSION + "]"; 1.21 + }, 1.22 + toString: function () { 1.23 + return this.__repr__(); 1.24 + }, 1.25 + 1.26 + /** @id MochiKit.Iter.registerIteratorFactory */ 1.27 + registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) { 1.28 + MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override); 1.29 + }, 1.30 + 1.31 + /** @id MochiKit.Iter.isIterable */ 1.32 + isIterable: function(o) { 1.33 + return o != null && 1.34 + (typeof(o.next) == "function" || typeof(o.iter) == "function"); 1.35 + }, 1.36 + 1.37 + /** @id MochiKit.Iter.iter */ 1.38 + iter: function (iterable, /* optional */ sentinel) { 1.39 + var self = MochiKit.Iter; 1.40 + if (arguments.length == 2) { 1.41 + return self.takewhile( 1.42 + function (a) { return a != sentinel; }, 1.43 + iterable 1.44 + ); 1.45 + } 1.46 + if (typeof(iterable.next) == 'function') { 1.47 + return iterable; 1.48 + } else if (typeof(iterable.iter) == 'function') { 1.49 + return iterable.iter(); 1.50 + /* 1.51 + } else if (typeof(iterable.__iterator__) == 'function') { 1.52 + // 1.53 + // XXX: We can't support JavaScript 1.7 __iterator__ directly 1.54 + // because of Object.prototype.__iterator__ 1.55 + // 1.56 + return iterable.__iterator__(); 1.57 + */ 1.58 + } 1.59 + 1.60 + try { 1.61 + return self.iteratorRegistry.match(iterable); 1.62 + } catch (e) { 1.63 + var m = MochiKit.Base; 1.64 + if (e == m.NotFound) { 1.65 + e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable"); 1.66 + } 1.67 + throw e; 1.68 + } 1.69 + }, 1.70 + 1.71 + /** @id MochiKit.Iter.count */ 1.72 + count: function (n) { 1.73 + if (!n) { 1.74 + n = 0; 1.75 + } 1.76 + var m = MochiKit.Base; 1.77 + return { 1.78 + repr: function () { return "count(" + n + ")"; }, 1.79 + toString: m.forwardCall("repr"), 1.80 + next: m.counter(n) 1.81 + }; 1.82 + }, 1.83 + 1.84 + /** @id MochiKit.Iter.cycle */ 1.85 + cycle: function (p) { 1.86 + var self = MochiKit.Iter; 1.87 + var m = MochiKit.Base; 1.88 + var lst = []; 1.89 + var iterator = self.iter(p); 1.90 + return { 1.91 + repr: function () { return "cycle(...)"; }, 1.92 + toString: m.forwardCall("repr"), 1.93 + next: function () { 1.94 + try { 1.95 + var rval = iterator.next(); 1.96 + lst.push(rval); 1.97 + return rval; 1.98 + } catch (e) { 1.99 + if (e != self.StopIteration) { 1.100 + throw e; 1.101 + } 1.102 + if (lst.length === 0) { 1.103 + this.next = function () { 1.104 + throw self.StopIteration; 1.105 + }; 1.106 + } else { 1.107 + var i = -1; 1.108 + this.next = function () { 1.109 + i = (i + 1) % lst.length; 1.110 + return lst[i]; 1.111 + }; 1.112 + } 1.113 + return this.next(); 1.114 + } 1.115 + } 1.116 + }; 1.117 + }, 1.118 + 1.119 + /** @id MochiKit.Iter.repeat */ 1.120 + repeat: function (elem, /* optional */n) { 1.121 + var m = MochiKit.Base; 1.122 + if (typeof(n) == 'undefined') { 1.123 + return { 1.124 + repr: function () { 1.125 + return "repeat(" + m.repr(elem) + ")"; 1.126 + }, 1.127 + toString: m.forwardCall("repr"), 1.128 + next: function () { 1.129 + return elem; 1.130 + } 1.131 + }; 1.132 + } 1.133 + return { 1.134 + repr: function () { 1.135 + return "repeat(" + m.repr(elem) + ", " + n + ")"; 1.136 + }, 1.137 + toString: m.forwardCall("repr"), 1.138 + next: function () { 1.139 + if (n <= 0) { 1.140 + throw MochiKit.Iter.StopIteration; 1.141 + } 1.142 + n -= 1; 1.143 + return elem; 1.144 + } 1.145 + }; 1.146 + }, 1.147 + 1.148 + /** @id MochiKit.Iter.next */ 1.149 + next: function (iterator) { 1.150 + return iterator.next(); 1.151 + }, 1.152 + 1.153 + /** @id MochiKit.Iter.izip */ 1.154 + izip: function (p, q/*, ...*/) { 1.155 + var m = MochiKit.Base; 1.156 + var self = MochiKit.Iter; 1.157 + var next = self.next; 1.158 + var iterables = m.map(self.iter, arguments); 1.159 + return { 1.160 + repr: function () { return "izip(...)"; }, 1.161 + toString: m.forwardCall("repr"), 1.162 + next: function () { return m.map(next, iterables); } 1.163 + }; 1.164 + }, 1.165 + 1.166 + /** @id MochiKit.Iter.ifilter */ 1.167 + ifilter: function (pred, seq) { 1.168 + var m = MochiKit.Base; 1.169 + seq = MochiKit.Iter.iter(seq); 1.170 + if (pred === null) { 1.171 + pred = m.operator.truth; 1.172 + } 1.173 + return { 1.174 + repr: function () { return "ifilter(...)"; }, 1.175 + toString: m.forwardCall("repr"), 1.176 + next: function () { 1.177 + while (true) { 1.178 + var rval = seq.next(); 1.179 + if (pred(rval)) { 1.180 + return rval; 1.181 + } 1.182 + } 1.183 + // mozilla warnings aren't too bright 1.184 + return undefined; 1.185 + } 1.186 + }; 1.187 + }, 1.188 + 1.189 + /** @id MochiKit.Iter.ifilterfalse */ 1.190 + ifilterfalse: function (pred, seq) { 1.191 + var m = MochiKit.Base; 1.192 + seq = MochiKit.Iter.iter(seq); 1.193 + if (pred === null) { 1.194 + pred = m.operator.truth; 1.195 + } 1.196 + return { 1.197 + repr: function () { return "ifilterfalse(...)"; }, 1.198 + toString: m.forwardCall("repr"), 1.199 + next: function () { 1.200 + while (true) { 1.201 + var rval = seq.next(); 1.202 + if (!pred(rval)) { 1.203 + return rval; 1.204 + } 1.205 + } 1.206 + // mozilla warnings aren't too bright 1.207 + return undefined; 1.208 + } 1.209 + }; 1.210 + }, 1.211 + 1.212 + /** @id MochiKit.Iter.islice */ 1.213 + islice: function (seq/*, [start,] stop[, step] */) { 1.214 + var self = MochiKit.Iter; 1.215 + var m = MochiKit.Base; 1.216 + seq = self.iter(seq); 1.217 + var start = 0; 1.218 + var stop = 0; 1.219 + var step = 1; 1.220 + var i = -1; 1.221 + if (arguments.length == 2) { 1.222 + stop = arguments[1]; 1.223 + } else if (arguments.length == 3) { 1.224 + start = arguments[1]; 1.225 + stop = arguments[2]; 1.226 + } else { 1.227 + start = arguments[1]; 1.228 + stop = arguments[2]; 1.229 + step = arguments[3]; 1.230 + } 1.231 + return { 1.232 + repr: function () { 1.233 + return "islice(" + ["...", start, stop, step].join(", ") + ")"; 1.234 + }, 1.235 + toString: m.forwardCall("repr"), 1.236 + next: function () { 1.237 + var rval; 1.238 + while (i < start) { 1.239 + rval = seq.next(); 1.240 + i++; 1.241 + } 1.242 + if (start >= stop) { 1.243 + throw self.StopIteration; 1.244 + } 1.245 + start += step; 1.246 + return rval; 1.247 + } 1.248 + }; 1.249 + }, 1.250 + 1.251 + /** @id MochiKit.Iter.imap */ 1.252 + imap: function (fun, p, q/*, ...*/) { 1.253 + var m = MochiKit.Base; 1.254 + var self = MochiKit.Iter; 1.255 + var iterables = m.map(self.iter, m.extend(null, arguments, 1)); 1.256 + var map = m.map; 1.257 + var next = self.next; 1.258 + return { 1.259 + repr: function () { return "imap(...)"; }, 1.260 + toString: m.forwardCall("repr"), 1.261 + next: function () { 1.262 + return fun.apply(this, map(next, iterables)); 1.263 + } 1.264 + }; 1.265 + }, 1.266 + 1.267 + /** @id MochiKit.Iter.applymap */ 1.268 + applymap: function (fun, seq, self) { 1.269 + seq = MochiKit.Iter.iter(seq); 1.270 + var m = MochiKit.Base; 1.271 + return { 1.272 + repr: function () { return "applymap(...)"; }, 1.273 + toString: m.forwardCall("repr"), 1.274 + next: function () { 1.275 + return fun.apply(self, seq.next()); 1.276 + } 1.277 + }; 1.278 + }, 1.279 + 1.280 + /** @id MochiKit.Iter.chain */ 1.281 + chain: function (p, q/*, ...*/) { 1.282 + // dumb fast path 1.283 + var self = MochiKit.Iter; 1.284 + var m = MochiKit.Base; 1.285 + if (arguments.length == 1) { 1.286 + return self.iter(arguments[0]); 1.287 + } 1.288 + var argiter = m.map(self.iter, arguments); 1.289 + return { 1.290 + repr: function () { return "chain(...)"; }, 1.291 + toString: m.forwardCall("repr"), 1.292 + next: function () { 1.293 + while (argiter.length > 1) { 1.294 + try { 1.295 + var result = argiter[0].next(); 1.296 + return result; 1.297 + } catch (e) { 1.298 + if (e != self.StopIteration) { 1.299 + throw e; 1.300 + } 1.301 + argiter.shift(); 1.302 + var result = argiter[0].next(); 1.303 + return result; 1.304 + } 1.305 + } 1.306 + if (argiter.length == 1) { 1.307 + // optimize last element 1.308 + var arg = argiter.shift(); 1.309 + this.next = m.bind("next", arg); 1.310 + return this.next(); 1.311 + } 1.312 + throw self.StopIteration; 1.313 + } 1.314 + }; 1.315 + }, 1.316 + 1.317 + /** @id MochiKit.Iter.takewhile */ 1.318 + takewhile: function (pred, seq) { 1.319 + var self = MochiKit.Iter; 1.320 + seq = self.iter(seq); 1.321 + return { 1.322 + repr: function () { return "takewhile(...)"; }, 1.323 + toString: MochiKit.Base.forwardCall("repr"), 1.324 + next: function () { 1.325 + var rval = seq.next(); 1.326 + if (!pred(rval)) { 1.327 + this.next = function () { 1.328 + throw self.StopIteration; 1.329 + }; 1.330 + this.next(); 1.331 + } 1.332 + return rval; 1.333 + } 1.334 + }; 1.335 + }, 1.336 + 1.337 + /** @id MochiKit.Iter.dropwhile */ 1.338 + dropwhile: function (pred, seq) { 1.339 + seq = MochiKit.Iter.iter(seq); 1.340 + var m = MochiKit.Base; 1.341 + var bind = m.bind; 1.342 + return { 1.343 + "repr": function () { return "dropwhile(...)"; }, 1.344 + "toString": m.forwardCall("repr"), 1.345 + "next": function () { 1.346 + while (true) { 1.347 + var rval = seq.next(); 1.348 + if (!pred(rval)) { 1.349 + break; 1.350 + } 1.351 + } 1.352 + this.next = bind("next", seq); 1.353 + return rval; 1.354 + } 1.355 + }; 1.356 + }, 1.357 + 1.358 + _tee: function (ident, sync, iterable) { 1.359 + sync.pos[ident] = -1; 1.360 + var m = MochiKit.Base; 1.361 + var listMin = m.listMin; 1.362 + return { 1.363 + repr: function () { return "tee(" + ident + ", ...)"; }, 1.364 + toString: m.forwardCall("repr"), 1.365 + next: function () { 1.366 + var rval; 1.367 + var i = sync.pos[ident]; 1.368 + 1.369 + if (i == sync.max) { 1.370 + rval = iterable.next(); 1.371 + sync.deque.push(rval); 1.372 + sync.max += 1; 1.373 + sync.pos[ident] += 1; 1.374 + } else { 1.375 + rval = sync.deque[i - sync.min]; 1.376 + sync.pos[ident] += 1; 1.377 + if (i == sync.min && listMin(sync.pos) != sync.min) { 1.378 + sync.min += 1; 1.379 + sync.deque.shift(); 1.380 + } 1.381 + } 1.382 + return rval; 1.383 + } 1.384 + }; 1.385 + }, 1.386 + 1.387 + /** @id MochiKit.Iter.tee */ 1.388 + tee: function (iterable, n/* = 2 */) { 1.389 + var rval = []; 1.390 + var sync = { 1.391 + "pos": [], 1.392 + "deque": [], 1.393 + "max": -1, 1.394 + "min": -1 1.395 + }; 1.396 + if (arguments.length == 1 || typeof(n) == "undefined" || n === null) { 1.397 + n = 2; 1.398 + } 1.399 + var self = MochiKit.Iter; 1.400 + iterable = self.iter(iterable); 1.401 + var _tee = self._tee; 1.402 + for (var i = 0; i < n; i++) { 1.403 + rval.push(_tee(i, sync, iterable)); 1.404 + } 1.405 + return rval; 1.406 + }, 1.407 + 1.408 + /** @id MochiKit.Iter.list */ 1.409 + list: function (iterable) { 1.410 + // Fast-path for Array and Array-like 1.411 + var rval; 1.412 + if (iterable instanceof Array) { 1.413 + return iterable.slice(); 1.414 + } 1.415 + // this is necessary to avoid a Safari crash 1.416 + if (typeof(iterable) == "function" && 1.417 + !(iterable instanceof Function) && 1.418 + typeof(iterable.length) == 'number') { 1.419 + rval = []; 1.420 + for (var i = 0; i < iterable.length; i++) { 1.421 + rval.push(iterable[i]); 1.422 + } 1.423 + return rval; 1.424 + } 1.425 + 1.426 + var self = MochiKit.Iter; 1.427 + iterable = self.iter(iterable); 1.428 + var rval = []; 1.429 + var a_val; 1.430 + try { 1.431 + while (true) { 1.432 + a_val = iterable.next(); 1.433 + rval.push(a_val); 1.434 + } 1.435 + } catch (e) { 1.436 + if (e != self.StopIteration) { 1.437 + throw e; 1.438 + } 1.439 + return rval; 1.440 + } 1.441 + // mozilla warnings aren't too bright 1.442 + return undefined; 1.443 + }, 1.444 + 1.445 + 1.446 + /** @id MochiKit.Iter.reduce */ 1.447 + reduce: function (fn, iterable, /* optional */initial) { 1.448 + var i = 0; 1.449 + var x = initial; 1.450 + var self = MochiKit.Iter; 1.451 + iterable = self.iter(iterable); 1.452 + if (arguments.length < 3) { 1.453 + try { 1.454 + x = iterable.next(); 1.455 + } catch (e) { 1.456 + if (e == self.StopIteration) { 1.457 + e = new TypeError("reduce() of empty sequence with no initial value"); 1.458 + } 1.459 + throw e; 1.460 + } 1.461 + i++; 1.462 + } 1.463 + try { 1.464 + while (true) { 1.465 + x = fn(x, iterable.next()); 1.466 + } 1.467 + } catch (e) { 1.468 + if (e != self.StopIteration) { 1.469 + throw e; 1.470 + } 1.471 + } 1.472 + return x; 1.473 + }, 1.474 + 1.475 + /** @id MochiKit.Iter.range */ 1.476 + range: function (/* [start,] stop[, step] */) { 1.477 + var start = 0; 1.478 + var stop = 0; 1.479 + var step = 1; 1.480 + if (arguments.length == 1) { 1.481 + stop = arguments[0]; 1.482 + } else if (arguments.length == 2) { 1.483 + start = arguments[0]; 1.484 + stop = arguments[1]; 1.485 + } else if (arguments.length == 3) { 1.486 + start = arguments[0]; 1.487 + stop = arguments[1]; 1.488 + step = arguments[2]; 1.489 + } else { 1.490 + throw new TypeError("range() takes 1, 2, or 3 arguments!"); 1.491 + } 1.492 + if (step === 0) { 1.493 + throw new TypeError("range() step must not be 0"); 1.494 + } 1.495 + return { 1.496 + next: function () { 1.497 + if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) { 1.498 + throw MochiKit.Iter.StopIteration; 1.499 + } 1.500 + var rval = start; 1.501 + start += step; 1.502 + return rval; 1.503 + }, 1.504 + repr: function () { 1.505 + return "range(" + [start, stop, step].join(", ") + ")"; 1.506 + }, 1.507 + toString: MochiKit.Base.forwardCall("repr") 1.508 + }; 1.509 + }, 1.510 + 1.511 + /** @id MochiKit.Iter.sum */ 1.512 + sum: function (iterable, start/* = 0 */) { 1.513 + if (typeof(start) == "undefined" || start === null) { 1.514 + start = 0; 1.515 + } 1.516 + var x = start; 1.517 + var self = MochiKit.Iter; 1.518 + iterable = self.iter(iterable); 1.519 + try { 1.520 + while (true) { 1.521 + x += iterable.next(); 1.522 + } 1.523 + } catch (e) { 1.524 + if (e != self.StopIteration) { 1.525 + throw e; 1.526 + } 1.527 + } 1.528 + return x; 1.529 + }, 1.530 + 1.531 + /** @id MochiKit.Iter.exhaust */ 1.532 + exhaust: function (iterable) { 1.533 + var self = MochiKit.Iter; 1.534 + iterable = self.iter(iterable); 1.535 + try { 1.536 + while (true) { 1.537 + iterable.next(); 1.538 + } 1.539 + } catch (e) { 1.540 + if (e != self.StopIteration) { 1.541 + throw e; 1.542 + } 1.543 + } 1.544 + }, 1.545 + 1.546 + /** @id MochiKit.Iter.forEach */ 1.547 + forEach: function (iterable, func, /* optional */obj) { 1.548 + var m = MochiKit.Base; 1.549 + var self = MochiKit.Iter; 1.550 + if (arguments.length > 2) { 1.551 + func = m.bind(func, obj); 1.552 + } 1.553 + // fast path for array 1.554 + if (m.isArrayLike(iterable) && !self.isIterable(iterable)) { 1.555 + try { 1.556 + for (var i = 0; i < iterable.length; i++) { 1.557 + func(iterable[i]); 1.558 + } 1.559 + } catch (e) { 1.560 + if (e != self.StopIteration) { 1.561 + throw e; 1.562 + } 1.563 + } 1.564 + } else { 1.565 + self.exhaust(self.imap(func, iterable)); 1.566 + } 1.567 + }, 1.568 + 1.569 + /** @id MochiKit.Iter.every */ 1.570 + every: function (iterable, func) { 1.571 + var self = MochiKit.Iter; 1.572 + try { 1.573 + self.ifilterfalse(func, iterable).next(); 1.574 + return false; 1.575 + } catch (e) { 1.576 + if (e != self.StopIteration) { 1.577 + throw e; 1.578 + } 1.579 + return true; 1.580 + } 1.581 + }, 1.582 + 1.583 + /** @id MochiKit.Iter.sorted */ 1.584 + sorted: function (iterable, /* optional */cmp) { 1.585 + var rval = MochiKit.Iter.list(iterable); 1.586 + if (arguments.length == 1) { 1.587 + cmp = MochiKit.Base.compare; 1.588 + } 1.589 + rval.sort(cmp); 1.590 + return rval; 1.591 + }, 1.592 + 1.593 + /** @id MochiKit.Iter.reversed */ 1.594 + reversed: function (iterable) { 1.595 + var rval = MochiKit.Iter.list(iterable); 1.596 + rval.reverse(); 1.597 + return rval; 1.598 + }, 1.599 + 1.600 + /** @id MochiKit.Iter.some */ 1.601 + some: function (iterable, func) { 1.602 + var self = MochiKit.Iter; 1.603 + try { 1.604 + self.ifilter(func, iterable).next(); 1.605 + return true; 1.606 + } catch (e) { 1.607 + if (e != self.StopIteration) { 1.608 + throw e; 1.609 + } 1.610 + return false; 1.611 + } 1.612 + }, 1.613 + 1.614 + /** @id MochiKit.Iter.iextend */ 1.615 + iextend: function (lst, iterable) { 1.616 + var m = MochiKit.Base; 1.617 + var self = MochiKit.Iter; 1.618 + if (m.isArrayLike(iterable) && !self.isIterable(iterable)) { 1.619 + // fast-path for array-like 1.620 + for (var i = 0; i < iterable.length; i++) { 1.621 + lst.push(iterable[i]); 1.622 + } 1.623 + } else { 1.624 + iterable = self.iter(iterable); 1.625 + try { 1.626 + while (true) { 1.627 + lst.push(iterable.next()); 1.628 + } 1.629 + } catch (e) { 1.630 + if (e != self.StopIteration) { 1.631 + throw e; 1.632 + } 1.633 + } 1.634 + } 1.635 + return lst; 1.636 + }, 1.637 + 1.638 + /** @id MochiKit.Iter.groupby */ 1.639 + groupby: function(iterable, /* optional */ keyfunc) { 1.640 + var m = MochiKit.Base; 1.641 + var self = MochiKit.Iter; 1.642 + if (arguments.length < 2) { 1.643 + keyfunc = m.operator.identity; 1.644 + } 1.645 + iterable = self.iter(iterable); 1.646 + 1.647 + // shared 1.648 + var pk = undefined; 1.649 + var k = undefined; 1.650 + var v; 1.651 + 1.652 + function fetch() { 1.653 + v = iterable.next(); 1.654 + k = keyfunc(v); 1.655 + }; 1.656 + 1.657 + function eat() { 1.658 + var ret = v; 1.659 + v = undefined; 1.660 + return ret; 1.661 + }; 1.662 + 1.663 + var first = true; 1.664 + var compare = m.compare; 1.665 + return { 1.666 + repr: function () { return "groupby(...)"; }, 1.667 + next: function() { 1.668 + // iterator-next 1.669 + 1.670 + // iterate until meet next group 1.671 + while (compare(k, pk) === 0) { 1.672 + fetch(); 1.673 + if (first) { 1.674 + first = false; 1.675 + break; 1.676 + } 1.677 + } 1.678 + pk = k; 1.679 + return [k, { 1.680 + next: function() { 1.681 + // subiterator-next 1.682 + if (v == undefined) { // Is there something to eat? 1.683 + fetch(); 1.684 + } 1.685 + if (compare(k, pk) !== 0) { 1.686 + throw self.StopIteration; 1.687 + } 1.688 + return eat(); 1.689 + } 1.690 + }]; 1.691 + } 1.692 + }; 1.693 + }, 1.694 + 1.695 + /** @id MochiKit.Iter.groupby_as_array */ 1.696 + groupby_as_array: function (iterable, /* optional */ keyfunc) { 1.697 + var m = MochiKit.Base; 1.698 + var self = MochiKit.Iter; 1.699 + if (arguments.length < 2) { 1.700 + keyfunc = m.operator.identity; 1.701 + } 1.702 + 1.703 + iterable = self.iter(iterable); 1.704 + var result = []; 1.705 + var first = true; 1.706 + var prev_key; 1.707 + var compare = m.compare; 1.708 + while (true) { 1.709 + try { 1.710 + var value = iterable.next(); 1.711 + var key = keyfunc(value); 1.712 + } catch (e) { 1.713 + if (e == self.StopIteration) { 1.714 + break; 1.715 + } 1.716 + throw e; 1.717 + } 1.718 + if (first || compare(key, prev_key) !== 0) { 1.719 + var values = []; 1.720 + result.push([key, values]); 1.721 + } 1.722 + values.push(value); 1.723 + first = false; 1.724 + prev_key = key; 1.725 + } 1.726 + return result; 1.727 + }, 1.728 + 1.729 + /** @id MochiKit.Iter.arrayLikeIter */ 1.730 + arrayLikeIter: function (iterable) { 1.731 + var i = 0; 1.732 + return { 1.733 + repr: function () { return "arrayLikeIter(...)"; }, 1.734 + toString: MochiKit.Base.forwardCall("repr"), 1.735 + next: function () { 1.736 + if (i >= iterable.length) { 1.737 + throw MochiKit.Iter.StopIteration; 1.738 + } 1.739 + return iterable[i++]; 1.740 + } 1.741 + }; 1.742 + }, 1.743 + 1.744 + /** @id MochiKit.Iter.hasIterateNext */ 1.745 + hasIterateNext: function (iterable) { 1.746 + return (iterable && typeof(iterable.iterateNext) == "function"); 1.747 + }, 1.748 + 1.749 + /** @id MochiKit.Iter.iterateNextIter */ 1.750 + iterateNextIter: function (iterable) { 1.751 + return { 1.752 + repr: function () { return "iterateNextIter(...)"; }, 1.753 + toString: MochiKit.Base.forwardCall("repr"), 1.754 + next: function () { 1.755 + var rval = iterable.iterateNext(); 1.756 + if (rval === null || rval === undefined) { 1.757 + throw MochiKit.Iter.StopIteration; 1.758 + } 1.759 + return rval; 1.760 + } 1.761 + }; 1.762 + } 1.763 +}); 1.764 + 1.765 + 1.766 +MochiKit.Iter.EXPORT_OK = [ 1.767 + "iteratorRegistry", 1.768 + "arrayLikeIter", 1.769 + "hasIterateNext", 1.770 + "iterateNextIter" 1.771 +]; 1.772 + 1.773 +MochiKit.Iter.EXPORT = [ 1.774 + "StopIteration", 1.775 + "registerIteratorFactory", 1.776 + "iter", 1.777 + "count", 1.778 + "cycle", 1.779 + "repeat", 1.780 + "next", 1.781 + "izip", 1.782 + "ifilter", 1.783 + "ifilterfalse", 1.784 + "islice", 1.785 + "imap", 1.786 + "applymap", 1.787 + "chain", 1.788 + "takewhile", 1.789 + "dropwhile", 1.790 + "tee", 1.791 + "list", 1.792 + "reduce", 1.793 + "range", 1.794 + "sum", 1.795 + "exhaust", 1.796 + "forEach", 1.797 + "every", 1.798 + "sorted", 1.799 + "reversed", 1.800 + "some", 1.801 + "iextend", 1.802 + "groupby", 1.803 + "groupby_as_array" 1.804 +]; 1.805 + 1.806 +MochiKit.Iter.__new__ = function () { 1.807 + var m = MochiKit.Base; 1.808 + // Re-use StopIteration if exists (e.g. SpiderMonkey) 1.809 + if (typeof(StopIteration) != "undefined") { 1.810 + this.StopIteration = StopIteration; 1.811 + } else { 1.812 + /** @id MochiKit.Iter.StopIteration */ 1.813 + this.StopIteration = new m.NamedError("StopIteration"); 1.814 + } 1.815 + this.iteratorRegistry = new m.AdapterRegistry(); 1.816 + // Register the iterator factory for arrays 1.817 + this.registerIteratorFactory( 1.818 + "arrayLike", 1.819 + m.isArrayLike, 1.820 + this.arrayLikeIter 1.821 + ); 1.822 + 1.823 + this.registerIteratorFactory( 1.824 + "iterateNext", 1.825 + this.hasIterateNext, 1.826 + this.iterateNextIter 1.827 + ); 1.828 + 1.829 + this.EXPORT_TAGS = { 1.830 + ":common": this.EXPORT, 1.831 + ":all": m.concat(this.EXPORT, this.EXPORT_OK) 1.832 + }; 1.833 + 1.834 + m.nameFunctions(this); 1.835 + 1.836 +}; 1.837 + 1.838 +MochiKit.Iter.__new__(); 1.839 + 1.840 +// 1.841 +// XXX: Internet Explorer blows 1.842 +// 1.843 +if (MochiKit.__export__) { 1.844 + reduce = MochiKit.Iter.reduce; 1.845 +} 1.846 + 1.847 +MochiKit.Base._exportSymbols(this, MochiKit.Iter);