Skip to content

Instantly share code, notes, and snippets.

@jonschlinkert
Created May 18, 2021 06:25
Show Gist options
  • Save jonschlinkert/bcfc1fed2514da56da4d9d24bb55a7cd to your computer and use it in GitHub Desktop.
Save jonschlinkert/bcfc1fed2514da56da4d9d24bb55a7cd to your computer and use it in GitHub Desktop.

Revisions

  1. jonschlinkert created this gist May 18, 2021.
    64 changes: 64 additions & 0 deletions hash.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    'use strict';

    const values = new Map();

    const getValues = hash => {
    const v = values.get(hash) || new Map();
    values.set(hash, v);
    return v;
    };

    class Hash extends Map {
    constructor(...args) {
    super(...args);

    return new Proxy(this, {
    set(target, prop, value) {
    const desc = Reflect.getOwnPropertyDescriptor(target, prop);
    if (desc && typeof desc.value === 'function') {
    return target[prop](value);
    }
    if (desc && typeof desc.set === 'function') {
    target[prop] = value;
    return value;
    }

    target.set(prop, value);
    return value;
    },
    get(target, prop, receiver) {
    if (!(prop in target)) {
    return target.get(prop);
    }
    if (typeof target[prop] === 'function') {
    return target[prop].bind(target);
    }
    return target[prop];
    }
    });
    }

    set(key, value) {
    const values = getValues(this);
    values.set(value, key);
    return super.set(key, value);
    }

    delete(key) {
    const values = getValues(this);
    const value = this.get(key);
    values.delete(value);
    return super.delete(key);
    }

    key(value) {
    const values = getValues(this);
    return values.get(value);
    }
    }

    const hash = new Hash([['foo', 'bar'], ['baz', 'qux']]);

    hash.baz = 'whatever';
    console.log(hash.key('bar'));
    console.log(hash.has('baz'));