svkc
v1.0.0
Published
JavaScript's keyed collections (Map & Set) with SameValue semantics!
Downloads
464
Maintainers
Readme
Features
- Familiar:
SameValueMap
andSameValueSet
extend JavaScript's built-inMap
andSet
- Compliant: maintains all the invariants of
Map
andSet
including method return values and even iteration order! - Tiny: less than 350 bytes minzipped!
Install
$ npm i svkc
Huh?
A key in a Map
or a value in a Set
can only occur once. But how is the key
or value's uniqueness determined? JavaScript's Map
and Set
use the
sameValueZero
algorithm
when checking if two keys or values are equal. The algorithm considers +0 and -0
to be equal, but they are actually two different values due to how
IEEE floating point numbers
work. This means that both new Map([[0, 'zero'], [-0, 'negative zero']]).size
and new Set([0, -0]).size
return 1 rather than 2.
This package provides SameValueMap
and SameValueSet
that behave identically
to Map
and Set
except they consider +0 and -0 to be different values.
Usage
Just use like a normal Map
or Set
!
import { SameValueMap, SameValueSet } from 'svkc'
const sameValueMap = new SameValueMap()
sameValueMap.set(1, `one`)
sameValueMap.set(0, `zero`)
sameValueMap.set(-0, `negative zero`)
sameValueMap.set(-1, `negative one`)
console.log(sameValueMap.get(0))
//=> zero
console.log(sameValueMap.get(-0))
//=> negative zero
console.log([...sameValueMap])
//=> [ [ 1, 'one' ], [ 0, 'zero' ], [ -0, 'negative zero' ], [ -1, 'negative one' ] ]
sameValueMap.delete(0)
console.log(sameValueMap.has(0))
//=> false
console.log(sameValueMap.has(-0))
//=> true
const sameValueSet = new SameValueSet()
sameValueSet.add(1)
sameValueSet.add(0)
sameValueSet.add(-0)
sameValueSet.add(-1)
console.log(sameValueSet.has(0))
//=> true
console.log(sameValueSet.has(-0))
//=> true
console.log([...sameValueSet])
//=> [ 1, 0, -0, -1 ]
sameValueSet.delete(0)
console.log(sameValueSet.has(0))
//=> false
console.log(sameValueSet.has(-0))
//=> true
Contributing
Stars are always welcome!
For bugs and feature requests, please create an issue.
For pull requests, please read the contributing guidelines.
License
This is not an official Google product.