36 lines
785 B
JavaScript
36 lines
785 B
JavaScript
|
'use strict'
|
||
|
|
||
|
class Circular {
|
||
|
constructor () {
|
||
|
this.stack = new Map()
|
||
|
}
|
||
|
|
||
|
add (descriptor) {
|
||
|
if (this.stack.has(descriptor)) throw new Error('Already in stack')
|
||
|
|
||
|
if (descriptor.isItem !== true && descriptor.isMapEntry !== true && descriptor.isProperty !== true) {
|
||
|
this.stack.set(descriptor, this.stack.size + 1)
|
||
|
}
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
delete (descriptor) {
|
||
|
if (this.stack.has(descriptor)) {
|
||
|
if (this.stack.get(descriptor) !== this.stack.size) throw new Error('Not on top of stack')
|
||
|
this.stack.delete(descriptor)
|
||
|
}
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
has (descriptor) {
|
||
|
return this.stack.has(descriptor)
|
||
|
}
|
||
|
|
||
|
get (descriptor) {
|
||
|
return this.stack.has(descriptor)
|
||
|
? this.stack.get(descriptor)
|
||
|
: 0
|
||
|
}
|
||
|
}
|
||
|
module.exports = Circular
|