Maps for emplace, TC39 proposal-upsert implementation
npm install @miyauci/upsert








Maps for emplace, TC39
proposal-upsert implementation.
- Install
- Usage
- Insert
- Just insert
- Update
- Just update
- Emplaceable
- EmplaceableMap
- EmplaceableWeakMap
- Polyfill
- API
- Contributing
- License
deno.land:
``ts`
import * as mod from "https://deno.land/x/upsert/mod.ts";
npm:
`bash`
npm i @miyauci/upsert
Add a value to a map like if it does not already have something at key, andkey
will also update an existing value at .
`ts
import { emplace } from "https://deno.land/x/upsert/mod.ts";
import { assert } from "https://deno.land/std/testing/asserts.ts";
declare const map: Map
declare const key: string;
const result = emplace(map, key, {
insert: () => 0,
update: (existing) => ++existing,
});
assert(map.has(key));
`
Add the entry if the key does not exist.
`ts
import { emplace } from "https://deno.land/x/upsert/mod.ts";
import { assert } from "https://deno.land/std/testing/asserts.ts";
import {
assertType,
type IsExact,
} from "https://deno.land/std/testing/types.ts";
declare const map: Map
declare const key: string;
declare const value: number;
const result = emplace(map, key, { insert: () => value });
assert(map.has(key));
assertType
`
#### Just insert
If only inserting is required, insert is available.
`ts
import { insert } from "https://deno.land/x/upsert/mod.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
declare const key: string;
declare const value: number;
const map = new Map
insert(map, key, () => value);
assertEquals(map, new Map([[key, value]]));
`
Update the entry if the key exists.
`ts
import { emplace } from "https://deno.land/x/upsert/mod.ts";
import { assert } from "https://deno.land/std/testing/asserts.ts";
import {
assertType,
type IsExact,
} from "https://deno.land/std/testing/types.ts";
declare const map: Map
declare const key: string;
const result = emplace(map, key, { update: (existing) => ++existing });
assertType
`
#### Just update
If only updating is required, update is available.
`ts
import { update } from "https://deno.land/x/upsert/mod.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
declare const key: string;
const map = new Map([[key, 0]]);
update(map, key, (existing) => ++existing);
assertEquals(map, new Map([[key, 1]]));
`
Mixin for emplace.
`ts
import { emplaceable } from "https://deno.land/x/upsert/mod.ts";
import { assert } from "https://deno.land/std/testing/asserts.ts";
class MyMap extends emplaceable(Map) {}
assert(MyMap.prototype.emplace);
`
decorator style:
> note In TypeScript, decorators do not yet affect types.
`ts
import {
type Emplaceable,
emplaceable,
} from "https://deno.land/x/upsert/mod.ts";
import { assert } from "https://deno.land/std/testing/asserts.ts";
@emplaceable
class MyMap
interface MyMap
assert(MyMap.prototype.emplace);
`
Map with Emplaceable implementation.
`ts
import { EmplaceableMap } from "https://deno.land/x/upsert/mod.ts";
import {
assert,
assertInstanceOf,
} from "https://deno.land/std/testing/asserts.ts";
const map = new EmplaceableMap
assertInstanceOf(map, Map);
assert(map.emplace);
`
WeakMap with Emplaceable implementation.
`ts
import { EmplaceableWeakMap } from "https://deno.land/x/upsert/mod.ts";
import {
assert,
assertInstanceOf,
} from "https://deno.land/std/testing/asserts.ts";
const weakMap = new EmplaceableWeakMap();
assertInstanceOf(weakMap, WeakMap);
assert(weakMap.emplace);
`
Polyfill affects the global object. You must be very careful when using it.
`ts
import "https://deno.land/x/upsert/polyfill.ts";
import { assert } from "https://deno.land/std/testing/asserts.ts";
assert(Map.prototype.emplace);
assert(WeakMap.prototype.emplace);
``
See deno doc for all APIs.
See contributing.
MIT © 2023 Tomoki Miyauchi