npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

multikeys

v1.0.1

Published

Multikeys data structures collection

Downloads

5

Readme

multikeys

Multikeys data structures collection written in TypeScript: Map, Set, WeakMap and WeakSet. Based on trie data structure.

Benchmarks are located in ./benchmark directory. You can modify ./benchmark/index.js and run npm i && npm start to test your own use cases.

Results of calling set and get with random data (and random number of keys). You can find benchmark code in ./benchmark/index.js.

Maximum number of keys is 10

| package | set and get (ops/sec) | normalized on many-keys-map | |--------------------------------------------------------------|-----------------------|-------------------------------| | multikeymap | 1.37 ±19.20% | 0 | | many-keys-map | 27 795 ±0.84% | 1 | | multikey | 79 355 ±1.37% | 2.85 | | multikey-map | 153 616 ±1.32% | 5.52 | | multikeys | 185 565 ±1.70% | 6.67 |

Maximum number of keys is 100

| package | set and get (ops/sec) | normalized on many-keys-map | |--------------------------------------------------------------|-----------------------|-------------------------------| | multikeymap | fall with OOM | - | | many-keys-map | 7 120 ±0.92% | 1 | | multikey | 10 830 ±1.35% | 1.52 | | multikey-map | 29 635 ±1.26% | 4.16 | | multikeys | 43 394 ±1.52% | 6.09 |

Example of usage

const mkMap = new MKMap();

mkMap.set([1, 2, 3], 'foo');
mkMap.set([3, 2, 1], 'bar');

// order of keys matters
mkMap.get([1, 2, 3]); // => 'foo'
mkMap.get([3, 2, 1]); // => 'bar'

// an argument with empty keys is also valid
mkMap.set([], 'zero');
mkMap.get([]); // => 'zero'
const mkSet = new MKSet();
const obj = {};

mkSet.add([obj, 1]);
mkSet.has([{}, 1]); // => false, because {} is a new object, {} !== obj
mkSet.has([obj, 1]); // => true

Using MKMap we could simply add memoization to function with a variable number of arguments:

const {MKMap} = require("multikeys");

function memoize(func) {
    const mkMap = new MKMap();

    return (...args) => {
        if (mkMap.has(args)) {
            return mkMap.get(args);
        }

        const res = func(...args);

        mkMap.set(args, res);

        return res;
    };
}

Also, we could replace MKMap with MKWeakMap and get memoize with auto garbage collection. In such case only objects could be func arguments.

API

Table of contents

Classes

Class: MKMap<K, V>

Type parameters

Name | Default | :------ | :------ | K | any | V | any |

Table of contents

Constructors

Accessors

Methods

Constructors

constructor

+ new MKMap<K, V>(iterable?: Iterable<readonly [readonly K[], V]>): MKMap<K, V>

Creates a new MKMap object.

Could be called with initial keys-values.

const empty = new MKMap();
const withValues = new MKMap([
    [['key_1', 'key_2'], 'value'],
    [['key'], 'val']
]);
Type parameters:

Name | Default | :------ | :------ | K | any | V | any |

Parameters:

Name | Type | :------ | :------ | iterable? | Iterable<readonly [readonly K[], V]> |

Returns: MKMap<K, V>

Accessors

size

• get size(): number

Returns the number of keys/value pairs in the MKMap object.

Returns: number

Methods

[Symbol.iterator]

[Symbol.iterator](): IterableIterator<[K[], V]>

Returns a new Iterator object that contains an array of [keys, value] for each element in the MKMap object.

Returns: IterableIterator<[K[], V]>


clear

clear(): void

Removes all keys-value pairs from the MKMap object.

Returns: void


delete

delete(keys: readonly K[]): boolean

Returns true if an element in the MKMap object existed and has been removed, or false if the element does not exist.

const mkMap = new MKMap([['foo'], 'bar']);

mkMap.delete(['foo']); // => true
mkMap.delete(['foo']); // => false
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


entries

entries(): IterableIterator<[K[], V]>

Returns a new Iterator object that contains an array of [keys, value] for each element in the Map object.

Returns: IterableIterator<[K[], V]>


forEach

forEach(callbackFn: (value: V, keys: K[], map: MKMap<K, V>) => void): void

Calls callbackFn once for each keys-value pair present in the MKMap object.

Parameters:

Name | Type | :------ | :------ | callbackFn | (value: V, keys: K[], map: MKMap<K, V>) => void |

Returns: void


get

get(keys: readonly K[]): undefined | V

Returns the value associated to the keys, or undefined if there is none.

const mkMap = new MKMap([['foo'], 'bar']);

mkMap.get(['foo']); // => 'bar'
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: undefined | V


has

has(keys: readonly K[]): boolean

Returns a boolean asserting whether a value has been associated to the keys in the MKMap object or not.

const mkMap = new MKMap([['foo'], 'bar']);

mkMap.has(['foo']); // => true
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


keys

keys(): IterableIterator<K[]>

Returns a new Iterator object that contains the keys for each element in the MKMap.

Returns: IterableIterator<K[]>


set

set(keys: readonly K[], value: V): MKMap<K, V>

Sets the value for the keys in the MKMap object. Returns the MKMap object.

mkMap.set(['foo'], 'bar');
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] | value | V |

Returns: MKMap<K, V>


values

values(): IterableIterator<V>

Returns a new Iterator object that contains the values for each element in the MKMap object.

Returns: IterableIterator<V>

Class: MKSet<K>

Type parameters

Name | Default | :------ | :------ | K | any |

Table of contents

Constructors

Accessors

Methods

Constructors

constructor

+ new MKSet<K>(iterable?: Iterable<readonly K[]>): MKSet<K>

Creates a new MKSet object.

Could be called with initial keys.

const empty = new MKSet();
const withKeys = new MKSet([
    ['key'],
    ['few', 'keys']
]);
Type parameters:

Name | Default | :------ | :------ | K | any |

Parameters:

Name | Type | :------ | :------ | iterable? | Iterable<readonly K[]> |

Returns: MKSet<K>

Accessors

size

• get size(): number

Returns the number of values in the MKSet object.

Returns: number

Methods

[Symbol.iterator]

[Symbol.iterator](): IterableIterator<K[]>

Returns a new Iterator object that yields the keys for each element in the MKSet object.

Returns: IterableIterator<K[]>


add

add(keys: readonly K[]): void

Appends keys to the MKSet object.

mkSet.add([1, 2, 3]);
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: void


clear

clear(): void

Removes all elements from the MKSet object.

Returns: void


delete

delete(keys: readonly K[]): boolean

Removes the element associated to the keys and returns the value that MKSet.has(keys) would have previously returned. MKSet.has(keys) will return false afterwards.

const mkSet = new MKSet([['foo']]);

mkSet.delete(['foo']); // => true
mkSet.delete(['foo']); // => false
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


entries

entries(): IterableIterator<[K[], K[]]>

Returns a new Iterator object that contains an array of [keys, keys] for each element in the MKSet object.

Returns: IterableIterator<[K[], K[]]>


forEach

forEach(callbackFn: (value: K[], key: K[], map: MKSet<K>) => void): void

Calls callbackFn once for each value present in the MKSet object.

Parameters:

Name | Type | :------ | :------ | callbackFn | (value: K[], key: K[], map: MKSet<K>) => void |

Returns: void


has

has(keys: readonly K[]): boolean

Returns a boolean asserting whether an element is present with the given keys in the MKSet object or not.

const mkSet = new MKSet([['foo']]);

mkSet.has(['foo']); // => true
mkSet.has(['bar']); // => false
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


keys

keys(): IterableIterator<K[]>

Returns a new Iterator object that yields the keys for each element in the MKSet object. (this is the same as the values() method.)

Returns: IterableIterator<K[]>


values

values(): IterableIterator<K[]>

Returns a new Iterator object that yields the keys for each element in the MKSet object. (this is the same as the keys() method.)

Returns: IterableIterator<K[]>

Class: MKWeakMap<K, V>

Type parameters

Name | Type | Default | :------ | :------ | :------ | K | object | object | V | - | any |

Table of contents

Constructors

Methods

Constructors

constructor

+ new MKWeakMap<K, V>(iterable?: Iterable<readonly [readonly K[], V]>): MKWeakMap<K, V>

Creates a new MKWeakMap object.

Could be called with initial keys-values

const empty = new MKWeakMap();
const withValues = new MKWeakMap([
    [[{foo: 'bar'}], 'val']
]);
Type parameters:

Name | Type | Default | :------ | :------ | :------ | K | object | object | V | - | any |

Parameters:

Name | Type | :------ | :------ | iterable? | Iterable<readonly [readonly K[], V]> |

Returns: MKWeakMap<K, V>

Methods

delete

delete(keys: readonly K[]): boolean

Removes any value associated to the keys. Returns true if an element in the MKWeakMap object has been removed successfully.

const obj = {};
const mkWeakMap = new MKWeakMap([[obj, 'foo']]);

mkWeakMap.delete([obj]); // => true
mkWeakMap.delete([obj]); // => false
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


get

get(keys: readonly K[]): undefined | V

Returns the value associated to the keys, or undefined if there is none.

const obj = {};
const mkWeakMap = new MKWeakMap([[obj, 'foo']]);

mkWeakMap.get([obj]); // => 'foo'
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: undefined | V


has

has(keys: readonly K[]): boolean

Returns a Boolean asserting whether a value has been associated to the keys in the MKWeakMap object or not.

const obj = {};
const mkWeakMap = new MKWeakMap([[obj, 'foo']]);

mkWeakMap.has([obj]); // => 'true'
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


set

set(keys: readonly K[], value: V): MKWeakMap<K, V>

Sets the value for the keys in the MKWeakMap object. Returns the MKWeakMap object.

const mkWeakMap = new MKWeakMap();
const obj = {};

mkWeakMap.set([obj], 'foo');
mkWeakMap.get([obj]); // => 'foo'
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] | value | V |

Returns: MKWeakMap<K, V>

Class: MKWeakSet<K>

Type parameters

Name | Type | :------ | :------ | K | object |

Table of contents

Constructors

Methods

Constructors

constructor

+ new MKWeakSet<K>(iterable?: Iterable<readonly K[]>): MKWeakSet<K>

Creates a new MKWeakSet object.

Could be called with initial keys

const empty = new MKWeakSet();
const withValues = new MKWeakSet([
    [{foo: 'bar'}]
]);
Type parameters:

Name | Type | :------ | :------ | K | object |

Parameters:

Name | Type | :------ | :------ | iterable? | Iterable<readonly K[]> |

Returns: MKWeakSet<K>

Methods

add

add(keys: readonly K[]): void

Add keys to the MKWeakSet object.

const mkWeakSet = new MKWeakSet();
const obj = {};

mkWeakSet.add([obj]);
mkWeakSet.has([obj]); // => 'true'
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: void


delete

delete(keys: readonly K[]): boolean

Removes keys from the MKWeakSet. Returns true if keys has been removed successfully.

const obj = {};
const mkWeakSet = new MKWeakSet([[obj]]);

mkWeakSet.delete([obj]); // => true
mkWeakSet.delete([obj]); // => false
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean


has

has(keys: readonly K[]): boolean

Returns true if an element with the specified keys exists in the MKWeakSet object.

const obj = {};
const mkWeakSet = new MKWeakSet([[obj]]);

mkWeakSet.has([obj]); // => 'true'
Parameters:

Name | Type | :------ | :------ | keys | readonly K[] |

Returns: boolean