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.

    Install

    npm i multi-index

    DownloadsWeekly Downloads

    1

    Version

    0.0.2

    License

    MIT

    Unpacked Size

    25.9 kB

    Total Files

    9

    Last publish

    Collaborators

    • lagache
    • ashevat
    • duckranger
    • spacebug
    • almonds