multi-index
TypeScript icon, indicating that this package has built-in type declarations

0.0.2 • Public • Published

Build status

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.

Package Sidebar

Install

npm i multi-index

Weekly Downloads

1

Version

0.0.2

License

MIT

Unpacked Size

25.9 kB

Total Files

9

Last publish

Collaborators

  • lagache
  • ashevat
  • duckranger
  • spacebug
  • almonds