/branches/v2.0 trunk/Float/aspnet_client/system_web/4_0_30319/crystalreportviewers14/js/MochiKit/Iter.js

# · JavaScript · 807 lines · 287 code · 48 blank · 472 comment · 51 complexity · 109adb0608baed08d4f6510db8ba021e MD5 · raw file

  1. /***
  2. MochiKit.Iter 1.4
  3. See <http://mochikit.com/> for documentation, downloads, license, etc.
  4. (c) 2005 Bob Ippolito. All rights Reserved.
  5. ***/
  6. if (typeof(dojo) != 'undefined') {
  7. dojo.provide('MochiKit.Iter');
  8. dojo.require('MochiKit.Base');
  9. }
  10. if (typeof(JSAN) != 'undefined') {
  11. JSAN.use("MochiKit.Base", []);
  12. }
  13. try {
  14. if (typeof(MochiKit.Base) == 'undefined') {
  15. throw "";
  16. }
  17. } catch (e) {
  18. throw "MochiKit.Iter depends on MochiKit.Base!";
  19. }
  20. if (typeof(MochiKit.Iter) == 'undefined') {
  21. MochiKit.Iter = {};
  22. }
  23. MochiKit.Iter.NAME = "MochiKit.Iter";
  24. MochiKit.Iter.VERSION = "1.4";
  25. MochiKit.Base.update(MochiKit.Iter, {
  26. __repr__: function () {
  27. return "[" + this.NAME + " " + this.VERSION + "]";
  28. },
  29. toString: function () {
  30. return this.__repr__();
  31. },
  32. registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) {
  33. MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override);
  34. },
  35. iter: function (iterable, /* optional */ sentinel) {
  36. var self = MochiKit.Iter;
  37. if (arguments.length == 2) {
  38. return self.takewhile(
  39. function (a) { return a != sentinel; },
  40. iterable
  41. );
  42. }
  43. if (typeof(iterable.next) == 'function') {
  44. return iterable;
  45. } else if (typeof(iterable.iter) == 'function') {
  46. return iterable.iter();
  47. /*
  48. } else if (typeof(iterable.__iterator__) == 'function') {
  49. //
  50. // XXX: We can't support JavaScript 1.7 __iterator__ directly
  51. // because of Object.prototype.__iterator__
  52. //
  53. return iterable.__iterator__();
  54. */
  55. }
  56. try {
  57. return self.iteratorRegistry.match(iterable);
  58. } catch (e) {
  59. var m = MochiKit.Base;
  60. if (e == m.NotFound) {
  61. e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable");
  62. }
  63. throw e;
  64. }
  65. },
  66. // count: function (n) {
  67. // if (!n) {
  68. // n = 0;
  69. // }
  70. // var m = MochiKit.Base;
  71. // return {
  72. // repr: function () { return "count(" + n + ")"; },
  73. // toString: m.forwardCall("repr"),
  74. // next: m.counter(n)
  75. // };
  76. // },
  77. // cycle: function (p) {
  78. // var self = MochiKit.Iter;
  79. // var m = MochiKit.Base;
  80. // var lst = [];
  81. // var iterator = self.iter(p);
  82. // return {
  83. // repr: function () { return "cycle(...)"; },
  84. // toString: m.forwardCall("repr"),
  85. // next: function () {
  86. // try {
  87. // var rval = iterator.next();
  88. // lst.push(rval);
  89. // return rval;
  90. // } catch (e) {
  91. // if (e != self.StopIteration) {
  92. // throw e;
  93. // }
  94. // if (lst.length === 0) {
  95. // this.next = function () {
  96. // throw self.StopIteration;
  97. // };
  98. // } else {
  99. // var i = -1;
  100. // this.next = function () {
  101. // i = (i + 1) % lst.length;
  102. // return lst[i];
  103. // };
  104. // }
  105. // return this.next();
  106. // }
  107. // }
  108. // };
  109. // },
  110. repeat: function (elem, /* optional */n) {
  111. var m = MochiKit.Base;
  112. if (typeof(n) == 'undefined') {
  113. return {
  114. repr: function () {
  115. return "repeat(" + m.repr(elem) + ")";
  116. },
  117. toString: m.forwardCall("repr"),
  118. next: function () {
  119. return elem;
  120. }
  121. };
  122. }
  123. return {
  124. repr: function () {
  125. return "repeat(" + m.repr(elem) + ", " + n + ")";
  126. },
  127. toString: m.forwardCall("repr"),
  128. next: function () {
  129. if (n <= 0) {
  130. throw MochiKit.Iter.StopIteration;
  131. }
  132. n -= 1;
  133. return elem;
  134. }
  135. };
  136. },
  137. next: function (iterator) {
  138. return iterator.next();
  139. },
  140. // izip: function (p, q/*, ...*/) {
  141. // var m = MochiKit.Base;
  142. // var self = MochiKit.Iter;
  143. // var next = self.next;
  144. // var iterables = m.map(self.iter, arguments);
  145. // return {
  146. // repr: function () { return "izip(...)"; },
  147. // toString: m.forwardCall("repr"),
  148. // next: function () { return m.map(next, iterables); }
  149. // };
  150. // },
  151. ifilter: function (pred, seq) {
  152. var m = MochiKit.Base;
  153. seq = MochiKit.Iter.iter(seq);
  154. if (pred === null) {
  155. pred = m.operator.truth;
  156. }
  157. return {
  158. repr: function () { return "ifilter(...)"; },
  159. toString: m.forwardCall("repr"),
  160. next: function () {
  161. while (true) {
  162. var rval = seq.next();
  163. if (pred(rval)) {
  164. return rval;
  165. }
  166. }
  167. // mozilla warnings aren't too bright
  168. return undefined;
  169. }
  170. };
  171. },
  172. ifilterfalse: function (pred, seq) {
  173. var m = MochiKit.Base;
  174. seq = MochiKit.Iter.iter(seq);
  175. if (pred === null) {
  176. pred = m.operator.truth;
  177. }
  178. return {
  179. repr: function () { return "ifilterfalse(...)"; },
  180. toString: m.forwardCall("repr"),
  181. next: function () {
  182. while (true) {
  183. var rval = seq.next();
  184. if (!pred(rval)) {
  185. return rval;
  186. }
  187. }
  188. // mozilla warnings aren't too bright
  189. return undefined;
  190. }
  191. };
  192. },
  193. // islice: function (seq/*, [start,] stop[, step] */) {
  194. // var self = MochiKit.Iter;
  195. // var m = MochiKit.Base;
  196. // seq = self.iter(seq);
  197. // var start = 0;
  198. // var stop = 0;
  199. // var step = 1;
  200. // var i = -1;
  201. // if (arguments.length == 2) {
  202. // stop = arguments[1];
  203. // } else if (arguments.length == 3) {
  204. // start = arguments[1];
  205. // stop = arguments[2];
  206. // } else {
  207. // start = arguments[1];
  208. // stop = arguments[2];
  209. // step = arguments[3];
  210. // }
  211. // return {
  212. // repr: function () {
  213. // return "islice(" + ["...", start, stop, step].join(", ") + ")";
  214. // },
  215. // toString: m.forwardCall("repr"),
  216. // next: function () {
  217. // var rval;
  218. // while (i < start) {
  219. // rval = seq.next();
  220. // i++;
  221. // }
  222. // if (start >= stop) {
  223. // throw self.StopIteration;
  224. // }
  225. // start += step;
  226. // return rval;
  227. // }
  228. // };
  229. // },
  230. imap: function (fun, p, q/*, ...*/) {
  231. var m = MochiKit.Base;
  232. var self = MochiKit.Iter;
  233. var iterables = m.map(self.iter, m.extend(null, arguments, 1));
  234. var map = m.map;
  235. var next = self.next;
  236. return {
  237. repr: function () { return "imap(...)"; },
  238. toString: m.forwardCall("repr"),
  239. next: function () {
  240. return fun.apply(this, map(next, iterables));
  241. }
  242. };
  243. },
  244. // applymap: function (fun, seq, self) {
  245. // seq = MochiKit.Iter.iter(seq);
  246. // var m = MochiKit.Base;
  247. // return {
  248. // repr: function () { return "applymap(...)"; },
  249. // toString: m.forwardCall("repr"),
  250. // next: function () {
  251. // return fun.apply(self, seq.next());
  252. // }
  253. // };
  254. // },
  255. // chain: function (p, q/*, ...*/) {
  256. // // dumb fast path
  257. // var self = MochiKit.Iter;
  258. // var m = MochiKit.Base;
  259. // if (arguments.length == 1) {
  260. // return self.iter(arguments[0]);
  261. // }
  262. // var argiter = m.map(self.iter, arguments);
  263. // return {
  264. // repr: function () { return "chain(...)"; },
  265. // toString: m.forwardCall("repr"),
  266. // next: function () {
  267. // while (argiter.length > 1) {
  268. // try {
  269. // return argiter[0].next();
  270. // } catch (e) {
  271. // if (e != self.StopIteration) {
  272. // throw e;
  273. // }
  274. // argiter.shift();
  275. // }
  276. // }
  277. // if (argiter.length == 1) {
  278. // // optimize last element
  279. // var arg = argiter.shift();
  280. // this.next = m.bind("next", arg);
  281. // return this.next();
  282. // }
  283. // throw self.StopIteration;
  284. // }
  285. // };
  286. // },
  287. // takewhile: function (pred, seq) {
  288. // var self = MochiKit.Iter;
  289. // seq = self.iter(seq);
  290. // return {
  291. // repr: function () { return "takewhile(...)"; },
  292. // toString: MochiKit.Base.forwardCall("repr"),
  293. // next: function () {
  294. // var rval = seq.next();
  295. // if (!pred(rval)) {
  296. // this.next = function () {
  297. // throw self.StopIteration;
  298. // };
  299. // this.next();
  300. // }
  301. // return rval;
  302. // }
  303. // };
  304. // },
  305. // dropwhile: function (pred, seq) {
  306. // seq = MochiKit.Iter.iter(seq);
  307. // var m = MochiKit.Base;
  308. // var bind = m.bind;
  309. // return {
  310. // "repr": function () { return "dropwhile(...)"; },
  311. // "toString": m.forwardCall("repr"),
  312. // "next": function () {
  313. // while (true) {
  314. // var rval = seq.next();
  315. // if (!pred(rval)) {
  316. // break;
  317. // }
  318. // }
  319. // this.next = bind("next", seq);
  320. // return rval;
  321. // }
  322. // };
  323. // },
  324. // _tee: function (ident, sync, iterable) {
  325. // sync.pos[ident] = -1;
  326. // var m = MochiKit.Base;
  327. // var listMin = m.listMin;
  328. // return {
  329. // repr: function () { return "tee(" + ident + ", ...)"; },
  330. // toString: m.forwardCall("repr"),
  331. // next: function () {
  332. // var rval;
  333. // var i = sync.pos[ident];
  334. //
  335. // if (i == sync.max) {
  336. // rval = iterable.next();
  337. // sync.deque.push(rval);
  338. // sync.max += 1;
  339. // sync.pos[ident] += 1;
  340. // } else {
  341. // rval = sync.deque[i - sync.min];
  342. // sync.pos[ident] += 1;
  343. // if (i == sync.min && listMin(sync.pos) != sync.min) {
  344. // sync.min += 1;
  345. // sync.deque.shift();
  346. // }
  347. // }
  348. // return rval;
  349. // }
  350. // };
  351. // },
  352. // tee: function (iterable, n/* = 2 */) {
  353. // var rval = [];
  354. // var sync = {
  355. // "pos": [],
  356. // "deque": [],
  357. // "max": -1,
  358. // "min": -1
  359. // };
  360. // if (arguments.length == 1 || typeof(n) == "undefined" || n === null) {
  361. // n = 2;
  362. // }
  363. // var self = MochiKit.Iter;
  364. // iterable = self.iter(iterable);
  365. // var _tee = self._tee;
  366. // for (var i = 0; i < n; i++) {
  367. // rval.push(_tee(i, sync, iterable));
  368. // }
  369. // return rval;
  370. // },
  371. list: function (iterable) {
  372. // Fast-path for Array and Array-like
  373. var m = MochiKit.Base;
  374. if (typeof(iterable.slice) == 'function') {
  375. return iterable.slice();
  376. } else if (m.isArrayLike(iterable)) {
  377. return m.concat(iterable);
  378. }
  379. var self = MochiKit.Iter;
  380. iterable = self.iter(iterable);
  381. var rval = [];
  382. try {
  383. while (true) {
  384. rval.push(iterable.next());
  385. }
  386. } catch (e) {
  387. if (e != self.StopIteration) {
  388. throw e;
  389. }
  390. return rval;
  391. }
  392. // mozilla warnings aren't too bright
  393. return undefined;
  394. },
  395. // reduce: function (fn, iterable, /* optional */initial) {
  396. // var i = 0;
  397. // var x = initial;
  398. // var self = MochiKit.Iter;
  399. // iterable = self.iter(iterable);
  400. // if (arguments.length < 3) {
  401. // try {
  402. // x = iterable.next();
  403. // } catch (e) {
  404. // if (e == self.StopIteration) {
  405. // e = new TypeError("reduce() of empty sequence with no initial value");
  406. // }
  407. // throw e;
  408. // }
  409. // i++;
  410. // }
  411. // try {
  412. // while (true) {
  413. // x = fn(x, iterable.next());
  414. // }
  415. // } catch (e) {
  416. // if (e != self.StopIteration) {
  417. // throw e;
  418. // }
  419. // }
  420. // return x;
  421. // },
  422. // range: function (/* [start,] stop[, step] */) {
  423. // var start = 0;
  424. // var stop = 0;
  425. // var step = 1;
  426. // if (arguments.length == 1) {
  427. // stop = arguments[0];
  428. // } else if (arguments.length == 2) {
  429. // start = arguments[0];
  430. // stop = arguments[1];
  431. // } else if (arguments.length == 3) {
  432. // start = arguments[0];
  433. // stop = arguments[1];
  434. // step = arguments[2];
  435. // } else {
  436. // throw new TypeError("range() takes 1, 2, or 3 arguments!");
  437. // }
  438. // if (step === 0) {
  439. // throw new TypeError("range() step must not be 0");
  440. // }
  441. // return {
  442. // next: function () {
  443. // if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
  444. // throw MochiKit.Iter.StopIteration;
  445. // }
  446. // var rval = start;
  447. // start += step;
  448. // return rval;
  449. // },
  450. // repr: function () {
  451. // return "range(" + [start, stop, step].join(", ") + ")";
  452. // },
  453. // toString: MochiKit.Base.forwardCall("repr")
  454. // };
  455. // },
  456. //
  457. // sum: function (iterable, start/* = 0 */) {
  458. // if (typeof(start) == "undefined" || start === null) {
  459. // start = 0;
  460. // }
  461. // var x = start;
  462. // var self = MochiKit.Iter;
  463. // iterable = self.iter(iterable);
  464. // try {
  465. // while (true) {
  466. // x += iterable.next();
  467. // }
  468. // } catch (e) {
  469. // if (e != self.StopIteration) {
  470. // throw e;
  471. // }
  472. // }
  473. // return x;
  474. // },
  475. // exhaust: function (iterable) {
  476. // var self = MochiKit.Iter;
  477. // iterable = self.iter(iterable);
  478. // try {
  479. // while (true) {
  480. // iterable.next();
  481. // }
  482. // } catch (e) {
  483. // if (e != self.StopIteration) {
  484. // throw e;
  485. // }
  486. // }
  487. // },
  488. forEach: function (iterable, func, /* optional */self) {
  489. var m = MochiKit.Base;
  490. if (arguments.length > 2) {
  491. func = m.bind(func, self);
  492. }
  493. // fast path for array
  494. if (m.isArrayLike(iterable)) {
  495. try {
  496. for (var i = 0; i < iterable.length; i++) {
  497. func(iterable[i]);
  498. }
  499. } catch (e) {
  500. if (e != MochiKit.Iter.StopIteration) {
  501. throw e;
  502. }
  503. }
  504. } else {
  505. self = MochiKit.Iter;
  506. self.exhaust(self.imap(func, iterable));
  507. }
  508. },
  509. every: function (iterable, func) {
  510. var self = MochiKit.Iter;
  511. try {
  512. self.ifilterfalse(func, iterable).next();
  513. return false;
  514. } catch (e) {
  515. if (e != self.StopIteration) {
  516. throw e;
  517. }
  518. return true;
  519. }
  520. },
  521. // sorted: function (iterable, /* optional */cmp) {
  522. // var rval = MochiKit.Iter.list(iterable);
  523. // if (arguments.length == 1) {
  524. // cmp = MochiKit.Base.compare;
  525. // }
  526. // rval.sort(cmp);
  527. // return rval;
  528. // },
  529. // reversed: function (iterable) {
  530. // var rval = MochiKit.Iter.list(iterable);
  531. // rval.reverse();
  532. // return rval;
  533. // },
  534. //
  535. // some: function (iterable, func) {
  536. // var self = MochiKit.Iter;
  537. // try {
  538. // self.ifilter(func, iterable).next();
  539. // return true;
  540. // } catch (e) {
  541. // if (e != self.StopIteration) {
  542. // throw e;
  543. // }
  544. // return false;
  545. // }
  546. // },
  547. //
  548. // iextend: function (lst, iterable) {
  549. // if (MochiKit.Base.isArrayLike(iterable)) {
  550. // // fast-path for array-like
  551. // for (var i = 0; i < iterable.length; i++) {
  552. // lst.push(iterable[i]);
  553. // }
  554. // } else {
  555. // var self = MochiKit.Iter;
  556. // iterable = self.iter(iterable);
  557. // try {
  558. // while (true) {
  559. // lst.push(iterable.next());
  560. // }
  561. // } catch (e) {
  562. // if (e != self.StopIteration) {
  563. // throw e;
  564. // }
  565. // }
  566. // }
  567. // return lst;
  568. // },
  569. // groupby: function(iterable, /* optional */ keyfunc) {
  570. // var m = MochiKit.Base;
  571. // var self = MochiKit.Iter;
  572. // if (arguments.length < 2) {
  573. // keyfunc = m.operator.identity;
  574. // }
  575. // iterable = self.iter(iterable);
  576. //
  577. // // shared
  578. // var pk = undefined;
  579. // var k = undefined;
  580. // var v;
  581. //
  582. // function fetch() {
  583. // v = iterable.next();
  584. // k = keyfunc(v);
  585. // };
  586. //
  587. // function eat() {
  588. // var ret = v;
  589. // v = undefined;
  590. // return ret;
  591. // };
  592. //
  593. // var first = true;
  594. // return {
  595. // repr: function () { return "groupby(...)"; },
  596. // next: function() {
  597. // // iterator-next
  598. //
  599. // // iterate until meet next group
  600. // while (k == pk) {
  601. // fetch();
  602. // if (first) {
  603. // first = false;
  604. // break;
  605. // }
  606. // }
  607. // pk = k;
  608. // return [k, {
  609. // next: function() {
  610. // // subiterator-next
  611. // if (v == undefined) { // Is there something to eat?
  612. // fetch();
  613. // }
  614. // if (k != pk) {
  615. // throw self.StopIteration;
  616. // }
  617. // return eat();
  618. // }
  619. // }];
  620. // }
  621. // };
  622. // },
  623. // groupby_as_array: function (iterable, /* optional */ keyfunc) {
  624. // var m = MochiKit.Base;
  625. // var self = MochiKit.Iter;
  626. // if (arguments.length < 2) {
  627. // keyfunc = m.operator.identity;
  628. // }
  629. //
  630. // iterable = self.iter(iterable);
  631. // var result = [];
  632. // var first = true;
  633. // var prev_key;
  634. // while (true) {
  635. // try {
  636. // var value = iterable.next();
  637. // var key = keyfunc(value);
  638. // } catch (e) {
  639. // if (e == self.StopIteration) {
  640. // break;
  641. // }
  642. // throw e;
  643. // }
  644. // if (first || key != prev_key) {
  645. // var values = [];
  646. // result.push([key, values]);
  647. // }
  648. // values.push(value);
  649. // first = false;
  650. // prev_key = key;
  651. // }
  652. // return result;
  653. // },
  654. arrayLikeIter: function (iterable) {
  655. var i = 0;
  656. return {
  657. repr: function () { return "arrayLikeIter(...)"; },
  658. toString: MochiKit.Base.forwardCall("repr"),
  659. next: function () {
  660. if (i >= iterable.length) {
  661. throw MochiKit.Iter.StopIteration;
  662. }
  663. return iterable[i++];
  664. }
  665. };
  666. },
  667. hasIterateNext: function (iterable) {
  668. return (iterable && typeof(iterable.iterateNext) == "function");
  669. },
  670. iterateNextIter: function (iterable) {
  671. return {
  672. repr: function () { return "iterateNextIter(...)"; },
  673. toString: MochiKit.Base.forwardCall("repr"),
  674. next: function () {
  675. var rval = iterable.iterateNext();
  676. if (rval === null || rval === undefined) {
  677. throw MochiKit.Iter.StopIteration;
  678. }
  679. return rval;
  680. }
  681. };
  682. }
  683. });
  684. MochiKit.Iter.EXPORT_OK = [
  685. "iteratorRegistry",
  686. "arrayLikeIter",
  687. "hasIterateNext",
  688. "iterateNextIter",
  689. ];
  690. MochiKit.Iter.EXPORT = [
  691. "StopIteration",
  692. "registerIteratorFactory",
  693. "iter",
  694. "count",
  695. "cycle",
  696. "repeat",
  697. "next",
  698. "izip",
  699. "ifilter",
  700. "ifilterfalse",
  701. "islice",
  702. "imap",
  703. "applymap",
  704. "chain",
  705. "takewhile",
  706. "dropwhile",
  707. "tee",
  708. "list",
  709. "reduce",
  710. "range",
  711. "sum",
  712. "exhaust",
  713. "forEach",
  714. "every",
  715. "sorted",
  716. "reversed",
  717. "some",
  718. "iextend",
  719. "groupby",
  720. "groupby_as_array"
  721. ];
  722. MochiKit.Iter.__new__ = function () {
  723. var m = MochiKit.Base;
  724. // Re-use StopIteration if exists (e.g. SpiderMonkey)
  725. if (typeof(StopIteration) != "undefined") {
  726. this.StopIteration = StopIteration;
  727. } else {
  728. this.StopIteration = new m.NamedError("StopIteration");
  729. }
  730. this.iteratorRegistry = new m.AdapterRegistry();
  731. // Register the iterator factory for arrays
  732. this.registerIteratorFactory(
  733. "arrayLike",
  734. m.isArrayLike,
  735. this.arrayLikeIter
  736. );
  737. this.registerIteratorFactory(
  738. "iterateNext",
  739. this.hasIterateNext,
  740. this.iterateNextIter
  741. );
  742. this.EXPORT_TAGS = {
  743. ":common": this.EXPORT,
  744. ":all": m.concat(this.EXPORT, this.EXPORT_OK)
  745. };
  746. m.nameFunctions(this);
  747. };
  748. MochiKit.Iter.__new__();
  749. //
  750. // XXX: Internet Explorer blows
  751. //
  752. if (MochiKit.__export__) {
  753. reduce = MochiKit.Iter.reduce;
  754. }
  755. MochiKit.Base._exportSymbols(this, MochiKit.Iter);