Browse Source

[refactor] Members instead of Closures

master
Muthu Kumar 6 years ago
parent
commit
a74ac5cdb3
  1. 134
      index.js
  2. 2
      package.json

134
index.js

@ -22,37 +22,38 @@ class InfiniteListItem {
* @memberof InfiniteListItem * @memberof InfiniteListItem
*/ */
constructor(list, value, index) { constructor(list, value, index) {
this.__list__ = list;
this.value = value; this.value = value;
this.index = index; this.index = index;
this.next = z => (!z ? list.get(index + 1) : list.get(index + z)); this.next = z => (!z ? this.__list__.get(index + 1) : this.__list__.get(index + z));
this.previous = z => (!z ? list.get(index - 1) : list.get(index - z)); this.previous = z => (!z ? this.__list__.get(index - 1) : this.__list__.get(index - z));
}
}
// Check if Symbol exists // Check if environment supports Symbol
if (typeof Symbol !== 'undefined' && Symbol.iterator) { if (typeof Symbol !== 'undefined' && Symbol.iterator) {
/** /**
* ES6 Symbol.iterator * ES6 Symbol.iterator
* @returns {Iterable.<InfiniteListItem>} * @returns {Iterable.<InfiniteListItem>}
*/ */
this[Symbol.iterator] = () => ({ InfiniteListItem.prototype[Symbol.iterator] = () => ({
next: () => ({ next: () => ({
value: list.get(index + 1), value: this.__list__.get(index + 1),
done: false done: false
}) })
}); });
} }
}
/** /**
* toString method for pretty printing InfiniteListItem instance. * toString method for pretty printing InfiniteListItem instance.
* @returns {String} Decycled and beautified string * @returns {String} Decycled and beautified string
* @memberof InfiniteListItem * @memberof InfiniteListItem
*/ */
toString() { InfiniteListItem.prototype.toString = function () {
return ('InfiniteListItem [ .. ' + return ('InfiniteListItem [ .. ' +
stringify(this.value) + stringify(this.value) +
' .. ]') ' .. ]');
} };
}
class InfiniteList { class InfiniteList {
/** /**
@ -68,17 +69,61 @@ class InfiniteList {
*/ */
constructor(start, next) { constructor(start, next) {
// Closure magic! this.__start__ = start;
let cache = []; this.__next__ = next;
let j = 0; this.__cache__ = [];
if(typeof Proxy !== 'undefined')
return new Proxy(this, {
get: (obj, key) => {
if(key in obj) return obj[key];
const index = (
typeof key === 'string' && /^\d*$/g.test(key)
) ? parseInt(key) : undefined;
if(index) return obj['get'](index);
},
has: (obj, key) => {
const index = (
typeof key === 'string' && /^\d*$/g.test(key)
) ? parseInt(key) : undefined;
return (
(key in obj) ||
(areNumbers(index) &&
(index % 1 === 0) &&
(index >= 0))
)
},
enumerate: obj => obj.keys(),
ownKeys: obj => obj.keys(),
})
}
}
// Check if Symbol exists
if (typeof Symbol !== 'undefined' && Symbol.iterator) {
/** /**
* ES6 Symbol.iterator
* @returns {Iterable.<InfiniteListItem>}
* @memberof InfiniteList
*/
InfiniteList.prototype[Symbol.iterator] = function () {
let j = 0;
return {
next: () => ({
value: this.get(j++),
done: false
})
};
};
}
/**
* Get InfiniteListItem at index. * Get InfiniteListItem at index.
* @param {Number} index A non-negative integer representing index * @param {Number} index A non-negative integer representing index
* @returns {InfiniteListItem} * @returns {InfiniteListItem}
* @memberof InfiniteList * @memberof InfiniteList
*/ */
this.get = function (index) { InfiniteList.prototype.get = function (index) {
// Validation // Validation
if ( if (
@ -87,6 +132,10 @@ class InfiniteList {
|| !areNumbers(index) || !areNumbers(index)
) return; ) return;
const start = this.__start__;
const next = this.__next__;
const cache = this.__cache__;
//TODO: Cache limiting. (Removed for unexpected behaviour) //TODO: Cache limiting. (Removed for unexpected behaviour)
// Initializing first item if it doesn't exist // Initializing first item if it doesn't exist
@ -108,59 +157,18 @@ class InfiniteList {
); );
} }
return new InfiniteListItem(this, cache[index], index); return new InfiniteListItem(this, cache[index], index);
} }
/** /**
* Clear cache manually. * Clear cache manually.
* Forces destroy reference to cache, and creates a new cache. * Forces destroy reference to cache, and creates a new cache.
* Old cache will be GC'd. * Old cache will be GC'd.
* @returns {undefined} * @returns {undefined}
* @memberof InfiniteList * @memberof InfiniteList
*/ */
this.clearCache = () => (cache = [], undefined); InfiniteList.prototype.clearCache = function () {
this.__cache__ = [];
// Check if Symbol exists };
if (typeof Symbol !== 'undefined' && Symbol.iterator) {
/**
* ES6 Symbol.iterator
* @returns {Iterable.<InfiniteListItem>}
* @memberof InfiniteList
*/
this[Symbol.iterator] = function () {
return {
next: () => ({
value: this.get(j++),
done: false
})
};
};
}
if(typeof Proxy !== 'undefined')
return new Proxy(this, {
get: (obj, key) => {
if(key in obj) return obj[key];
const index = (
typeof key === 'string' && /^\d*$/g.test(key)
) ? parseInt(key) : undefined;
if(index) return obj['get'](index);
},
has: (obj, key) => {
const index = (
typeof key === 'string' && /^\d*$/g.test(key)
) ? parseInt(key) : undefined;
return (
(key in obj) ||
(areNumbers(index) &&
(index % 1 === 0) &&
(index >= 0))
)
},
enumerate: obj => obj.keys(),
ownKeys: obj => obj.keys(),
})
}
}
/** /**
* Takes a given number of elements from the InfiniteList. * Takes a given number of elements from the InfiniteList.

2
package.json

@ -1,6 +1,6 @@
{ {
"name": "@codefeathers/infinity", "name": "@codefeathers/infinity",
"version": "0.3.0", "version": "0.4.0",
"description": "Infinitely generating linked list with memoisation (or an n-generator)", "description": "Infinitely generating linked list with memoisation (or an n-generator)",
"main": "es5/infinity.min.js", "main": "es5/infinity.min.js",
"scripts": { "scripts": {

Loading…
Cancel
Save