JavaScript's keyed collections (Map & Set) with SameValue semantics!
npm install svkc- Familiar: SameValueMap and SameValueSet extend JavaScript's built-in
Map and Set
- Compliant: maintains all the invariants of Map and Set including
method return values and even iteration order!
- Tiny: less than 350 bytes minzipped!
``sh`
$ npm i svkc
A key in a Map or a value in a Set can only occur once. But how is the keyMap
or value's uniqueness determined? JavaScript's and Set use thesameValueZero algorithmnew Map([[0, 'zero'], [-0, 'negative zero']]).size
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 Set([0, -0]).size
and return 1 rather than 2.
This package provides SameValueMap and SameValueSet that behave identicallyMap
to and Set except they consider +0 and -0 to be different values.
Just use like a normal Map or Set!
`js
import { SameValueMap, SameValueSet } from 'svkc'
const sameValueMap = new SameValueMap()
sameValueMap.set(1, one)zero
sameValueMap.set(0, )negative zero
sameValueMap.set(-0, )negative one
sameValueMap.set(-1, )
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
``
Stars are always welcome!
For bugs and feature requests,
please create an issue.