pojo-sets
v0.1.0
Published
Plain old Javascript Set implementation
Downloads
323
Readme
POJO Sets
In using React and Redux, you may find that you have to use POJO objects instead of ES6+ native objects like Set
and Map
. This project aims to provide a well typed, immutable POJO Set implementation that can simplify tasks you often do with POJO sets.
Quick start
Install the package
yarn add pojo-sets
Import and start using it!
import { PojoSet } from 'pojo-sets';
const mySet = PojoSet.from(['foo', 'bar']);
Usage
PojoSets are meant to be a drop-in replacement everywhere you use immutable Record<T, boolean>
structures. Their main benefit is when contrustricting these Sets, since you get to avoid manual [].reduce()
construction.
// Traditional set construction:
const oldSchool = ['foo', 'bar'].reduce((acc, next) => {
return {
...acc,
[next]: true,
};
}, {} as Record<string, boolean>);
// typeof oldSchool: Record<string, boolean>
// With PojoSet helper:
const newHotness = PojoSet.from(['foo', 'bar']);
// typeof newHotness: PojoSet<'foo' | 'bar'>
The traditional method requires a manual type assertion, reduce
has issues inferring types. And, of course, if you want stricter types on your Set, you'd have to build that manually. PojoSet.from
handles all the type assertions for you.
Since you get stricter types out of the box with PojoSet
, you get compile time checks for well-defined sets.
// ERROR! Property 'baz' does not exist on type 'PojoSet<"foo" | "bar">'.(7053)
if(newHotness['baz']) {
// ...
}
For a quick demo, check out this Typescript Playground
Advanced Usage
For the sake of completeness, this package also contains various immutable Set operations, as well as some nice ways to construct sets from Typescript enum
s.
Check out our unit tests for complete usage. But, here's a brief overview:
enum Fruits {
Apple = 'apple',
Orange = 'orange',
Banana = 'banana',
}
const fruits = PojoSet.fromEnum(Fruits);
const fruitsAndVeggies = PojoSet.add(fruits, 'tomato');
const veggies = PojoSet.difference(fruitsAndVeggies, fruits);
expect(PojoSet.union(fruits, veggies)).toEqual(fruitsAndVeggies);
expect(PojoSet.remove(fruitsAndVeggies, 'tomato')).toEqual(fruits);
expect(PojoSet.intersection(fruits, veggies)).toEqual(PojoSet.empty());
// Print all fruits and veggies
console.log(PojoSet.toArray(fruitsAndVeggies).join(', '));