Skip to content

Instantly share code, notes, and snippets.

@axetroy

axetroy/cycle.js

Last active Dec 6, 2017
Embed
What would you like to do?
环形数据结构
class Node {
constructor(prev, value, next) {
this.prev = prev;
this.next = next;
this.value = value;
}
}
const CURRENT_INDEX = Symbol('current index in cycle');
const ROUND_INDEX = Symbol('how many round in cycle');
const MAP_KEY = Symbol('map in cycle');
class Cycle {
constructor(nodes) {
this[CURRENT_INDEX] = 0;
this[ROUND_INDEX] = 0;
this[MAP_KEY] = new Map();
Object.defineProperty(this, 'length', {
enumerable: false,
configurable: false,
value: nodes.length
});
for (let i = 0; i < this.length; i++) {
let node;
if (i === 0) {
node = new Node(
nodes[this.length - 1],
nodes[i],
nodes[Math.min(this.length - 1, i + 1)]
);
} else if (i === this.length - 1) {
node = new Node(nodes[i - 1], nodes[i], nodes[0]);
} else {
node = new Node(nodes[i - 1], nodes[i], nodes[i + 1]);
}
this[MAP_KEY].set(i, node);
}
}
get current() {
return this[MAP_KEY].get(this[CURRENT_INDEX]).value;
}
get prev() {
return this[MAP_KEY].get(this[CURRENT_INDEX]).prev;
}
get next() {
return this[MAP_KEY].get(this[CURRENT_INDEX]).next;
}
tick() {
let nextIndex = this[CURRENT_INDEX] + 1;
if (nextIndex >= this.length) {
nextIndex = 0;
this[ROUND_INDEX]++;
}
this[CURRENT_INDEX] = nextIndex;
}
}
module.exports = Cycle;
const Cycle = require('./cycle')
const c = new Cycle([
{ username: 'a' },
{ username: 'b' },
{ username: 'c' },
{ username: 'd' },
{ username: 'e' }
]);
console.log(c);
console.log(c.prev);
console.log(c.current);
console.log(c.next);
c.tick();
console.info('go to next tick');
console.log(c.prev);
console.log(c.current);
console.log(c.next);
c.tick();
console.info('go to next tick');
console.log(c.prev);
console.log(c.current);
console.log(c.next);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment