123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- 'use strict';
- module.metadata = {
- "stability": "experimental"
- };
- const { Class } = require('../core/heritage');
- const listNS = require('../core/namespace').ns();
- const { iteratorSymbol } = require('../util/iteration');
- const listOptions = {
- /**
- * List constructor can take any number of element to populate itself.
- * @params {Object|String|Number} element
- * @example
- * List(1,2,3).length == 3 // true
- */
- initialize: function List() {
- listNS(this).keyValueMap = [];
- for (let i = 0, ii = arguments.length; i < ii; i++)
- addListItem(this, arguments[i]);
- },
- /**
- * Number of elements in this list.
- * @type {Number}
- */
- get length() listNS(this).keyValueMap.length,
- /**
- * Returns a string representing this list.
- * @returns {String}
- */
- toString: function toString() 'List(' + listNS(this).keyValueMap + ')',
- /**
- * Custom iterator providing `List`s enumeration behavior.
- * We cant reuse `_iterator` that is defined by `Iterable` since it provides
- * iteration in an arbitrary order.
- * @see https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in
- * @param {Boolean} onKeys
- */
- __iterator__: function __iterator__(onKeys, onKeyValue) {
- let array = listNS(this).keyValueMap.slice(0),
- i = -1;
- for each(let element in array)
- yield onKeyValue ? [++i, element] : onKeys ? ++i : element;
- },
- };
- listOptions[iteratorSymbol] = function iterator() {
- return listNS(this).keyValueMap.slice(0)[iteratorSymbol]();
- };
- const List = Class(listOptions);
- exports.List = List;
- function addListItem(that, value) {
- let list = listNS(that).keyValueMap,
- index = list.indexOf(value);
- if (-1 === index) {
- try {
- that[that.length] = value;
- }
- catch (e) {}
- list.push(value);
- }
- }
- exports.addListItem = addListItem;
- function removeListItem(that, element) {
- let list = listNS(that).keyValueMap,
- index = list.indexOf(element);
- if (0 <= index) {
- list.splice(index, 1);
- try {
- for (let length = list.length; index < length; index++)
- that[index] = list[index];
- that[list.length] = undefined;
- }
- catch(e){}
- }
- }
- exports.removeListItem = removeListItem;
- exports.listNS = listNS;
|