Skip to content

Composite keys, TC39 proposal-richer-keys of compositeKey implementation

License

Notifications You must be signed in to change notification settings

TomokiMiyauci/composite-key

Repository files navigation

composite-key

JSR codecov GitHub semantic-release: angular standard-readme compliant

Composite keys, TC39 proposal-richer-keys, compositeKey implementation.

Table of Contents

Install

deno:

deno add @miyauci/composite-key

node:

npx jsr add @miyauci/composite-key

Usage

compositeKey

Return reference consisting of a component. This allows using a Map, Set and WeakMap to weakly and/or privately associate data with the lifetime of a group of values.

It requires at least one component must be object that can be placed in a WeakMap.

import { compositeKey } from "@miyauci/composite-key";
import { assertEquals, assertNotEquals } from "@std/assert";

declare const fn: (a: number, b: number) => number;

assertEquals(compositeKey(fn, 0, 1), compositeKey(fn, 0, 1));
assertNotEquals(compositeKey(fn, 1, 0), compositeKey(fn, 0, 1));

// @ts-expect-error it require one of more object.
compositeKey(0, 1);

compositeSymbol

Return Symbol consisting of a component. This allows strongly attaching data to an object that is associated with a group of values.

import { compositeSymbol } from "@miyauci/composite-key";
import { assertEquals, assertNotEquals } from "@std/assert";

declare const object: object;

assertEquals(compositeSymbol(0, 1), compositeSymbol(0, 1));
assertEquals(compositeSymbol(0, object), compositeSymbol(0, object));

assertNotEquals(compositeSymbol(0), compositeSymbol(1));
assertNotEquals(compositeSymbol(0, {}), compositeSymbol(0, {}));

Polyfill

Polyfill affects the global object. You must be very careful when using it.

import "@miyauci/composite-key/polyfill";
import { assert } from "@std/assert";

assert(compositeKey);
assert(compositeSymbol);

API

See jsr doc for all APIs.

License

Copyright © 2023-present Tomoki Miyauchi.

Released under the MIT license