summaryrefslogtreecommitdiff
path: root/javascript/MochiKit/Iter.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/MochiKit/Iter.js')
-rwxr-xr-xjavascript/MochiKit/Iter.js851
1 files changed, 0 insertions, 851 deletions
diff --git a/javascript/MochiKit/Iter.js b/javascript/MochiKit/Iter.js
deleted file mode 100755
index 3b8e095..0000000
--- a/javascript/MochiKit/Iter.js
+++ /dev/null
@@ -1,851 +0,0 @@
-/***
-
-MochiKit.Iter 1.4
-
-See <http://mochikit.com/> for documentation, downloads, license, etc.
-
-(c) 2005 Bob Ippolito. All rights Reserved.
-
-***/
-
-if (typeof(dojo) != 'undefined') {
- dojo.provide('MochiKit.Iter');
- dojo.require('MochiKit.Base');
-}
-
-if (typeof(JSAN) != 'undefined') {
- JSAN.use("MochiKit.Base", []);
-}
-
-try {
- if (typeof(MochiKit.Base) == 'undefined') {
- throw "";
- }
-} catch (e) {
- throw "MochiKit.Iter depends on MochiKit.Base!";
-}
-
-if (typeof(MochiKit.Iter) == 'undefined') {
- MochiKit.Iter = {};
-}
-
-MochiKit.Iter.NAME = "MochiKit.Iter";
-MochiKit.Iter.VERSION = "1.4";
-MochiKit.Base.update(MochiKit.Iter, {
- __repr__: function () {
- return "[" + this.NAME + " " + this.VERSION + "]";
- },
- toString: function () {
- return this.__repr__();
- },
-
- /** @id MochiKit.Iter.registerIteratorFactory */
- registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) {
- MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override);
- },
-
- /** @id MochiKit.Iter.iter */
- iter: function (iterable, /* optional */ sentinel) {
- var self = MochiKit.Iter;
- if (arguments.length == 2) {
- return self.takewhile(
- function (a) { return a != sentinel; },
- iterable
- );
- }
- if (typeof(iterable.next) == 'function') {
- return iterable;
- } else if (typeof(iterable.iter) == 'function') {
- return iterable.iter();
- /*
- } else if (typeof(iterable.__iterator__) == 'function') {
- //
- // XXX: We can't support JavaScript 1.7 __iterator__ directly
- // because of Object.prototype.__iterator__
- //
- return iterable.__iterator__();
- */
- }
-
- try {
- return self.iteratorRegistry.match(iterable);
- } catch (e) {
- var m = MochiKit.Base;
- if (e == m.NotFound) {
- e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable");
- }
- throw e;
- }
- },
-
- /** @id MochiKit.Iter.count */
- count: function (n) {
- if (!n) {
- n = 0;
- }
- var m = MochiKit.Base;
- return {
- repr: function () { return "count(" + n + ")"; },
- toString: m.forwardCall("repr"),
- next: m.counter(n)
- };
- },
-
- /** @id MochiKit.Iter.cycle */
- cycle: function (p) {
- var self = MochiKit.Iter;
- var m = MochiKit.Base;
- var lst = [];
- var iterator = self.iter(p);
- return {
- repr: function () { return "cycle(...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- try {
- var rval = iterator.next();
- lst.push(rval);
- return rval;
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- if (lst.length === 0) {
- this.next = function () {
- throw self.StopIteration;
- };
- } else {
- var i = -1;
- this.next = function () {
- i = (i + 1) % lst.length;
- return lst[i];
- };
- }
- return this.next();
- }
- }
- };
- },
-
- /** @id MochiKit.Iter.repeat */
- repeat: function (elem, /* optional */n) {
- var m = MochiKit.Base;
- if (typeof(n) == 'undefined') {
- return {
- repr: function () {
- return "repeat(" + m.repr(elem) + ")";
- },
- toString: m.forwardCall("repr"),
- next: function () {
- return elem;
- }
- };
- }
- return {
- repr: function () {
- return "repeat(" + m.repr(elem) + ", " + n + ")";
- },
- toString: m.forwardCall("repr"),
- next: function () {
- if (n <= 0) {
- throw MochiKit.Iter.StopIteration;
- }
- n -= 1;
- return elem;
- }
- };
- },
-
- /** @id MochiKit.Iter.next */
- next: function (iterator) {
- return iterator.next();
- },
-
- /** @id MochiKit.Iter.izip */
- izip: function (p, q/*, ...*/) {
- var m = MochiKit.Base;
- var self = MochiKit.Iter;
- var next = self.next;
- var iterables = m.map(self.iter, arguments);
- return {
- repr: function () { return "izip(...)"; },
- toString: m.forwardCall("repr"),
- next: function () { return m.map(next, iterables); }
- };
- },
-
- /** @id MochiKit.Iter.ifilter */
- ifilter: function (pred, seq) {
- var m = MochiKit.Base;
- seq = MochiKit.Iter.iter(seq);
- if (pred === null) {
- pred = m.operator.truth;
- }
- return {
- repr: function () { return "ifilter(...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- while (true) {
- var rval = seq.next();
- if (pred(rval)) {
- return rval;
- }
- }
- // mozilla warnings aren't too bright
- return undefined;
- }
- };
- },
-
- /** @id MochiKit.Iter.ifilterfalse */
- ifilterfalse: function (pred, seq) {
- var m = MochiKit.Base;
- seq = MochiKit.Iter.iter(seq);
- if (pred === null) {
- pred = m.operator.truth;
- }
- return {
- repr: function () { return "ifilterfalse(...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- while (true) {
- var rval = seq.next();
- if (!pred(rval)) {
- return rval;
- }
- }
- // mozilla warnings aren't too bright
- return undefined;
- }
- };
- },
-
- /** @id MochiKit.Iter.islice */
- islice: function (seq/*, [start,] stop[, step] */) {
- var self = MochiKit.Iter;
- var m = MochiKit.Base;
- seq = self.iter(seq);
- var start = 0;
- var stop = 0;
- var step = 1;
- var i = -1;
- if (arguments.length == 2) {
- stop = arguments[1];
- } else if (arguments.length == 3) {
- start = arguments[1];
- stop = arguments[2];
- } else {
- start = arguments[1];
- stop = arguments[2];
- step = arguments[3];
- }
- return {
- repr: function () {
- return "islice(" + ["...", start, stop, step].join(", ") + ")";
- },
- toString: m.forwardCall("repr"),
- next: function () {
- var rval;
- while (i < start) {
- rval = seq.next();
- i++;
- }
- if (start >= stop) {
- throw self.StopIteration;
- }
- start += step;
- return rval;
- }
- };
- },
-
- /** @id MochiKit.Iter.imap */
- imap: function (fun, p, q/*, ...*/) {
- var m = MochiKit.Base;
- var self = MochiKit.Iter;
- var iterables = m.map(self.iter, m.extend(null, arguments, 1));
- var map = m.map;
- var next = self.next;
- return {
- repr: function () { return "imap(...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- return fun.apply(this, map(next, iterables));
- }
- };
- },
-
- /** @id MochiKit.Iter.applymap */
- applymap: function (fun, seq, self) {
- seq = MochiKit.Iter.iter(seq);
- var m = MochiKit.Base;
- return {
- repr: function () { return "applymap(...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- return fun.apply(self, seq.next());
- }
- };
- },
-
- /** @id MochiKit.Iter.chain */
- chain: function (p, q/*, ...*/) {
- // dumb fast path
- var self = MochiKit.Iter;
- var m = MochiKit.Base;
- if (arguments.length == 1) {
- return self.iter(arguments[0]);
- }
- var argiter = m.map(self.iter, arguments);
- return {
- repr: function () { return "chain(...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- while (argiter.length > 1) {
- try {
- return argiter[0].next();
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- argiter.shift();
- }
- }
- if (argiter.length == 1) {
- // optimize last element
- var arg = argiter.shift();
- this.next = m.bind("next", arg);
- return this.next();
- }
- throw self.StopIteration;
- }
- };
- },
-
- /** @id MochiKit.Iter.takewhile */
- takewhile: function (pred, seq) {
- var self = MochiKit.Iter;
- seq = self.iter(seq);
- return {
- repr: function () { return "takewhile(...)"; },
- toString: MochiKit.Base.forwardCall("repr"),
- next: function () {
- var rval = seq.next();
- if (!pred(rval)) {
- this.next = function () {
- throw self.StopIteration;
- };
- this.next();
- }
- return rval;
- }
- };
- },
-
- /** @id MochiKit.Iter.dropwhile */
- dropwhile: function (pred, seq) {
- seq = MochiKit.Iter.iter(seq);
- var m = MochiKit.Base;
- var bind = m.bind;
- return {
- "repr": function () { return "dropwhile(...)"; },
- "toString": m.forwardCall("repr"),
- "next": function () {
- while (true) {
- var rval = seq.next();
- if (!pred(rval)) {
- break;
- }
- }
- this.next = bind("next", seq);
- return rval;
- }
- };
- },
-
- _tee: function (ident, sync, iterable) {
- sync.pos[ident] = -1;
- var m = MochiKit.Base;
- var listMin = m.listMin;
- return {
- repr: function () { return "tee(" + ident + ", ...)"; },
- toString: m.forwardCall("repr"),
- next: function () {
- var rval;
- var i = sync.pos[ident];
-
- if (i == sync.max) {
- rval = iterable.next();
- sync.deque.push(rval);
- sync.max += 1;
- sync.pos[ident] += 1;
- } else {
- rval = sync.deque[i - sync.min];
- sync.pos[ident] += 1;
- if (i == sync.min && listMin(sync.pos) != sync.min) {
- sync.min += 1;
- sync.deque.shift();
- }
- }
- return rval;
- }
- };
- },
-
- /** @id MochiKit.Iter.tee */
- tee: function (iterable, n/* = 2 */) {
- var rval = [];
- var sync = {
- "pos": [],
- "deque": [],
- "max": -1,
- "min": -1
- };
- if (arguments.length == 1 || typeof(n) == "undefined" || n === null) {
- n = 2;
- }
- var self = MochiKit.Iter;
- iterable = self.iter(iterable);
- var _tee = self._tee;
- for (var i = 0; i < n; i++) {
- rval.push(_tee(i, sync, iterable));
- }
- return rval;
- },
-
- /** @id MochiKit.Iter.list */
- list: function (iterable) {
- // Fast-path for Array and Array-like
- var rval;
- if (iterable instanceof Array) {
- return iterable.slice();
- }
- // this is necessary to avoid a Safari crash
- if (typeof(iterable) == "function" &&
- !(iterable instanceof Function) &&
- typeof(iterable.length) == 'number') {
- rval = [];
- for (var i = 0; i < iterable.length; i++) {
- rval.push(iterable[i]);
- }
- return rval;
- }
-
- var self = MochiKit.Iter;
- iterable = self.iter(iterable);
- var rval = [];
- try {
- while (true) {
- rval.push(iterable.next());
- }
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- return rval;
- }
- // mozilla warnings aren't too bright
- return undefined;
- },
-
-
- /** @id MochiKit.Iter.reduce */
- reduce: function (fn, iterable, /* optional */initial) {
- var i = 0;
- var x = initial;
- var self = MochiKit.Iter;
- iterable = self.iter(iterable);
- if (arguments.length < 3) {
- try {
- x = iterable.next();
- } catch (e) {
- if (e == self.StopIteration) {
- e = new TypeError("reduce() of empty sequence with no initial value");
- }
- throw e;
- }
- i++;
- }
- try {
- while (true) {
- x = fn(x, iterable.next());
- }
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- }
- return x;
- },
-
- /** @id MochiKit.Iter.range */
- range: function (/* [start,] stop[, step] */) {
- var start = 0;
- var stop = 0;
- var step = 1;
- if (arguments.length == 1) {
- stop = arguments[0];
- } else if (arguments.length == 2) {
- start = arguments[0];
- stop = arguments[1];
- } else if (arguments.length == 3) {
- start = arguments[0];
- stop = arguments[1];
- step = arguments[2];
- } else {
- throw new TypeError("range() takes 1, 2, or 3 arguments!");
- }
- if (step === 0) {
- throw new TypeError("range() step must not be 0");
- }
- return {
- next: function () {
- if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
- throw MochiKit.Iter.StopIteration;
- }
- var rval = start;
- start += step;
- return rval;
- },
- repr: function () {
- return "range(" + [start, stop, step].join(", ") + ")";
- },
- toString: MochiKit.Base.forwardCall("repr")
- };
- },
-
- /** @id MochiKit.Iter.sum */
- sum: function (iterable, start/* = 0 */) {
- if (typeof(start) == "undefined" || start === null) {
- start = 0;
- }
- var x = start;
- var self = MochiKit.Iter;
- iterable = self.iter(iterable);
- try {
- while (true) {
- x += iterable.next();
- }
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- }
- return x;
- },
-
- /** @id MochiKit.Iter.exhaust */
- exhaust: function (iterable) {
- var self = MochiKit.Iter;
- iterable = self.iter(iterable);
- try {
- while (true) {
- iterable.next();
- }
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- }
- },
-
- /** @id MochiKit.Iter.forEach */
- forEach: function (iterable, func, /* optional */self) {
- var m = MochiKit.Base;
- if (arguments.length > 2) {
- func = m.bind(func, self);
- }
- // fast path for array
- if (m.isArrayLike(iterable)) {
- try {
- for (var i = 0; i < iterable.length; i++) {
- func(iterable[i]);
- }
- } catch (e) {
- if (e != MochiKit.Iter.StopIteration) {
- throw e;
- }
- }
- } else {
- self = MochiKit.Iter;
- self.exhaust(self.imap(func, iterable));
- }
- },
-
- /** @id MochiKit.Iter.every */
- every: function (iterable, func) {
- var self = MochiKit.Iter;
- try {
- self.ifilterfalse(func, iterable).next();
- return false;
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- return true;
- }
- },
-
- /** @id MochiKit.Iter.sorted */
- sorted: function (iterable, /* optional */cmp) {
- var rval = MochiKit.Iter.list(iterable);
- if (arguments.length == 1) {
- cmp = MochiKit.Base.compare;
- }
- rval.sort(cmp);
- return rval;
- },
-
- /** @id MochiKit.Iter.reversed */
- reversed: function (iterable) {
- var rval = MochiKit.Iter.list(iterable);
- rval.reverse();
- return rval;
- },
-
- /** @id MochiKit.Iter.some */
- some: function (iterable, func) {
- var self = MochiKit.Iter;
- try {
- self.ifilter(func, iterable).next();
- return true;
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- return false;
- }
- },
-
- /** @id MochiKit.Iter.iextend */
- iextend: function (lst, iterable) {
- if (MochiKit.Base.isArrayLike(iterable)) {
- // fast-path for array-like
- for (var i = 0; i < iterable.length; i++) {
- lst.push(iterable[i]);
- }
- } else {
- var self = MochiKit.Iter;
- iterable = self.iter(iterable);
- try {
- while (true) {
- lst.push(iterable.next());
- }
- } catch (e) {
- if (e != self.StopIteration) {
- throw e;
- }
- }
- }
- return lst;
- },
-
- /** @id MochiKit.Iter.groupby */
- groupby: function(iterable, /* optional */ keyfunc) {
- var m = MochiKit.Base;
- var self = MochiKit.Iter;
- if (arguments.length < 2) {
- keyfunc = m.operator.identity;
- }
- iterable = self.iter(iterable);
-
- // shared
- var pk = undefined;
- var k = undefined;
- var v;
-
- function fetch() {
- v = iterable.next();
- k = keyfunc(v);
- };
-
- function eat() {
- var ret = v;
- v = undefined;
- return ret;
- };
-
- var first = true;
- var compare = m.compare;
- return {
- repr: function () { return "groupby(...)"; },
- next: function() {
- // iterator-next
-
- // iterate until meet next group
- while (compare(k, pk) === 0) {
- fetch();
- if (first) {
- first = false;
- break;
- }
- }
- pk = k;
- return [k, {
- next: function() {
- // subiterator-next
- if (v == undefined) { // Is there something to eat?
- fetch();
- }
- if (compare(k, pk) !== 0) {
- throw self.StopIteration;
- }
- return eat();
- }
- }];
- }
- };
- },
-
- /** @id MochiKit.Iter.groupby_as_array */
- groupby_as_array: function (iterable, /* optional */ keyfunc) {
- var m = MochiKit.Base;
- var self = MochiKit.Iter;
- if (arguments.length < 2) {
- keyfunc = m.operator.identity;
- }
-
- iterable = self.iter(iterable);
- var result = [];
- var first = true;
- var prev_key;
- var compare = m.compare;
- while (true) {
- try {
- var value = iterable.next();
- var key = keyfunc(value);
- } catch (e) {
- if (e == self.StopIteration) {
- break;
- }
- throw e;
- }
- if (first || compare(key, prev_key) !== 0) {
- var values = [];
- result.push([key, values]);
- }
- values.push(value);
- first = false;
- prev_key = key;
- }
- return result;
- },
-
- /** @id MochiKit.Iter.arrayLikeIter */
- arrayLikeIter: function (iterable) {
- var i = 0;
- return {
- repr: function () { return "arrayLikeIter(...)"; },
- toString: MochiKit.Base.forwardCall("repr"),
- next: function () {
- if (i >= iterable.length) {
- throw MochiKit.Iter.StopIteration;
- }
- return iterable[i++];
- }
- };
- },
-
- /** @id MochiKit.Iter.hasIterateNext */
- hasIterateNext: function (iterable) {
- return (iterable && typeof(iterable.iterateNext) == "function");
- },
-
- /** @id MochiKit.Iter.iterateNextIter */
- iterateNextIter: function (iterable) {
- return {
- repr: function () { return "iterateNextIter(...)"; },
- toString: MochiKit.Base.forwardCall("repr"),
- next: function () {
- var rval = iterable.iterateNext();
- if (rval === null || rval === undefined) {
- throw MochiKit.Iter.StopIteration;
- }
- return rval;
- }
- };
- }
-});
-
-
-MochiKit.Iter.EXPORT_OK = [
- "iteratorRegistry",
- "arrayLikeIter",
- "hasIterateNext",
- "iterateNextIter"
-];
-
-MochiKit.Iter.EXPORT = [
- "StopIteration",
- "registerIteratorFactory",
- "iter",
- "count",
- "cycle",
- "repeat",
- "next",
- "izip",
- "ifilter",
- "ifilterfalse",
- "islice",
- "imap",
- "applymap",
- "chain",
- "takewhile",
- "dropwhile",
- "tee",
- "list",
- "reduce",
- "range",
- "sum",
- "exhaust",
- "forEach",
- "every",
- "sorted",
- "reversed",
- "some",
- "iextend",
- "groupby",
- "groupby_as_array"
-];
-
-MochiKit.Iter.__new__ = function () {
- var m = MochiKit.Base;
- // Re-use StopIteration if exists (e.g. SpiderMonkey)
- if (typeof(StopIteration) != "undefined") {
- this.StopIteration = StopIteration;
- } else {
- /** @id MochiKit.Iter.StopIteration */
- this.StopIteration = new m.NamedError("StopIteration");
- }
- this.iteratorRegistry = new m.AdapterRegistry();
- // Register the iterator factory for arrays
- this.registerIteratorFactory(
- "arrayLike",
- m.isArrayLike,
- this.arrayLikeIter
- );
-
- this.registerIteratorFactory(
- "iterateNext",
- this.hasIterateNext,
- this.iterateNextIter
- );
-
- this.EXPORT_TAGS = {
- ":common": this.EXPORT,
- ":all": m.concat(this.EXPORT, this.EXPORT_OK)
- };
-
- m.nameFunctions(this);
-
-};
-
-MochiKit.Iter.__new__();
-
-//
-// XXX: Internet Explorer blows
-//
-if (MochiKit.__export__) {
- reduce = MochiKit.Iter.reduce;
-}
-
-MochiKit.Base._exportSymbols(this, MochiKit.Iter);