📄 iter.js
字号:
/***MochiKit.Iter 1.3.1See <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.3.1";MochiKit.Base.update(MochiKit.Iter, { __repr__: function () { return "[" + this.NAME + " " + this.VERSION + "]"; }, toString: function () { return this.__repr__(); }, registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) { MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override); }, 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(); } 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; } }, 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) }; }, 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(); } } }; }, 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; } }; }, next: function (iterator) { return iterator.next(); }, izip: function (p, q/*, ...*/) { var m = MochiKit.Base; var next = MochiKit.Iter.next; var iterables = m.map(iter, arguments); return { repr: function () { return "izip(...)"; }, toString: m.forwardCall("repr"), next: function () { return m.map(next, iterables); } }; }, 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; } }; }, 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; } }; }, 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; } }; }, 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)); } }; }, 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()); } }; }, 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; } }; }, 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; } }; }, 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; } }; }, tee: function (iterable, n/* = 2 */) { var rval = []; var sync = { "pos": [], "deque": [], "max": -1, "min": -1 }; if (arguments.length == 1) { 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; }, list: function (iterable) { // Fast-path for Array and Array-like var m = MochiKit.Base; if (typeof(iterable.slice) == 'function') { return iterable.slice(); } else if (m.isArrayLike(iterable)) { return m.concat(iterable); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -