# src/Map.js

    /** @private */
    class Map {

        constructor(items, baseId) {
            this.items = items || [];
            this._lastUniqueId = (baseId || 0) + 1;
        }

        /**
         * Usage:
         *
         * id = myMap.addItem("foo") // ID internally generated
         * id = myMap.addItem("foo", "bar") // ID is "foo"
         */
        addItem() {
            let item;
            if (arguments.length === 2) {
                const id = arguments[0];
                item = arguments[1];
                if (this.items[id]) { // Won't happen if given ID is string
                    throw "ID clash: '" + id + "'";
                }
                this.items[id] = item;
                return id;

            } else {
                item = arguments[0] || {};
                while (true) {
                    const findId = this._lastUniqueId++;
                    if (!this.items[findId]) {
                        this.items[findId] = item;
                        return findId;
                    }
                }
            }
        }

        removeItem(id) {
            const item = this.items[id];
            delete this.items[id];
            return item;
        }
    }

    export {Map};