levels.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. export class Levels {
  2. constructor() {
  3. this.level_ = [];
  4. }
  5. push(level) {
  6. this.level_.push(level);
  7. }
  8. pop() {
  9. return this.level_.pop();
  10. }
  11. peek() {
  12. return this.level_[this.level_.length - 1] || null;
  13. }
  14. indexOf(element) {
  15. const last = this.peek();
  16. return !last ? null : last.indexOf(element);
  17. }
  18. find(pred) {
  19. const last = this.peek();
  20. if (!last) {
  21. return null;
  22. }
  23. for (let i = 0, l = last.length; i < l; i++) {
  24. if (pred(last[i])) {
  25. return last[i];
  26. }
  27. }
  28. return null;
  29. }
  30. get(index) {
  31. const last = this.peek();
  32. return !last || index < 0 || index >= last.length ? null : last[index];
  33. }
  34. depth() {
  35. return this.level_.length;
  36. }
  37. clone() {
  38. const levels = new Levels();
  39. levels.level_ = this.level_.slice(0);
  40. return levels;
  41. }
  42. toString() {
  43. let str = '';
  44. for (let i = 0, level; (level = this.level_[i]); i++) {
  45. str +=
  46. '\n' +
  47. level.map(function (x) {
  48. return x.toString();
  49. });
  50. }
  51. return str;
  52. }
  53. }