SameValue Set
About
ECMAScript sets
(objects created with the Set constructor)
use an algorithm called SameValueZero
to compare elements when eliminating duplicate entries. SameValueZero does not equate any distinguishable
ECMAScript values except two: 0
and -0
. This choice of algorithm is problematic because it prevents
us from implementing a sensible map
operation. It is generally agreed upon that any map
function
should obey the identity and composition laws. However, we can construct a case where the composition law
is violated:
let set = 0 1 1 / x x ? -0 : x; // a simple map implementationSetprototype { let out = ; for let a of this out; return out;} // positive and negative zero are equated under SameValueZero, so one is eliminatedset; // Set { 0 } // a lawful map implementation requires the following two lines to be interchangeableset; // Set { 1/0 }set; // Set { 1/0, -1/0 }
SameValue sets use SameValue as the comparison algorithm for elimination. The SameValue algorithm does not equate any distinguishable ECMAScript values.
let set = 0 1 1 / x x ? -0 : x; // positive and negative zero are not equated under SameValue, so neither is eliminatedset; // SameValueSet { 0, -0 } // for SameValueSet, the following two lines are interchangeableset; // SameValueSet { 1/0, -1/0 }set; // SameValueSet { 1/0, -1/0 }
Installation
npm install samevalueset
Usage
;let emptySet = ;let set = anythingIterable;
SameValue sets inherit from Set
, so everything on Set.prototype
is available.
Additionally, SameValueSet.prototype.map
produces a new SameValue set with the given
function applied to every element in the target SameValue set.
Contributing
- Open a GitHub issue with a description of your desired change. If one exists already, leave a message stating that you are working on it.
- Fork this repo and clone the forked repo.
- Install dependencies with
npm install
. - Build and test in your environment with
npm run build && npm test
. - Create a feature branch. Make your changes. Add tests.
- Build and test in your environment with
npm run build && npm test
. - Make a commit that includes the text "fixes #XX" where XX is the GitHub issue.
- Open a Pull Request on GitHub.
License
3-clause BSD. See LICENSE.