multi-index
v0.0.2
Published
Multiple indexes on a single collection of objects
Downloads
14
Readme
Multi-Index: Containers with more than one index
Multi-index separates container storage from indexing. You store a set of objects and access them using any key you can compute from those objects.
Containers
Create a container:
import { Container, uniqueIndex, nonuniqueIndex } from 'multi-index';
interface Contact {
id: string; // unique
name: string;
nickname: string;
phone?: string;
}
const c = new Container<Contact>();
Everything works if you're using JavaScript, you'll just not bother with types:
const { Container, uniqueIndex, nonuniqueIndex } = require('multi-index');
const c = new Container();
Usually you'd add some indexes, but you can already add objects to that container:
const joeBloggs = { id: 17, name: 'Joe Bloggs', nickname: 'joe', phone: '+972-99-555-6666' };
c.add(joeBloggs)
.add({ id: 19, name: 'Ariel Shaqed (Scolnicov)', nickname: 'ariels', phone: '+972-99-666-5555', })
.add({ id: 23, name: 'Joseph', nickname: 'joe', });
You can also delete, but it has to be the same object you added:
c.delete(joeBloggs);
But let's keep Mr. Bloggs in there so we can look at indices...
c.add(joeBloggs);
Indices
Add a few indices:
const byId = uniqueIndex({ id }: Contact => id, 'by id').on(c);
const byNickname = nonuniqueIndex({ nickname }: Contact => nickname, 'by nickname').on(c);
Or in JavaScript, just don't add types to the functions:
const byId = uniqueIndex({ id } => id, 'by id').on(c);
const byNickname = nonuniqueIndex({ nickname } => nickname, 'by nickname').on(c);
Unique indices won't let you add the same element twice:
c.add({ id: 19, name: 'Impostor', nickname: 'ariels' }); // throws NonuniqueIndexError
(They also test for uniqueness if you add them to a container with
existing indexes, so byNickname
above could not be unique.)
Now you can look up elements:
byId.get(23); // returns { id: 23, name: 'Joseph', nickname: 'joe' }
byNickname.get('joe'); // returns Set([{ id: 23, name: 'Joseph', nickname: 'joe' }, joeBloggs])
Related projects
- indexify: A similar lightweight package, supports containers with multiple indexes. API is not type-safe for TypeScript. Less extensible.
- bimap: A specific container with 2 indices. You could implement a bidirectional map using a multi-index container.
- bim: Another bidirectional map.
- mnemonist: A variety of lower-level data structures. Unfortunately does not include multi-indexed containers.
- Boost multi_index: the ultimate multi-indexed container, for C++; highly performant.