/* global Set */ | |
const undef = typeof undefined; | |
class ObjectSet { | |
constructor( arrayOrObjectSet ){ | |
this._obj = Object.create(null); | |
this.size = 0; | |
if( arrayOrObjectSet != null ){ | |
let arr; | |
if( arrayOrObjectSet.instanceString != null && arrayOrObjectSet.instanceString() === this.instanceString() ){ | |
arr = arrayOrObjectSet.toArray(); | |
} else { | |
arr = arrayOrObjectSet; | |
} | |
for( let i = 0; i < arr.length; i++ ){ | |
this.add( arr[i] ); | |
} | |
} | |
} | |
instanceString(){ | |
return 'set'; | |
} | |
add( val ){ | |
let o = this._obj; | |
if( o[ val ] !== 1 ){ | |
o[ val ] = 1; | |
this.size++; | |
} | |
} | |
delete( val ){ | |
let o = this._obj; | |
if( o[ val ] === 1 ){ | |
o[ val ] = 0; | |
this.size--; | |
} | |
} | |
clear(){ | |
this._obj = Object.create(null); | |
} | |
has( val ){ | |
return this._obj[ val ] === 1; | |
} | |
toArray(){ | |
return Object.keys( this._obj ).filter( key => this.has(key) ); | |
} | |
forEach( callback, thisArg ){ | |
return this.toArray().forEach( callback, thisArg ); | |
} | |
} | |
export default typeof Set !== undef ? Set : ObjectSet; | |