// @flow import type {valueOrPrimitive} from './value.js'; // eslint-disable-line no-unused-vars import {Collection} from './collection.js'; import {equals} from './value.js'; import {OrderedSequence} from './ordered_sequence.js'; type Entry = { key: K, value: V }; export class NomsMap extends Collection { async has(key: K): Promise { let cursor = await this.sequence.newCursorAt(this.cs, key); return cursor.valid && equals(cursor.getCurrentKey(), key); } async first(): Promise { let cursor = await this.sequence.newCursorAt(this.cs, null); if (!cursor.valid) { return undefined; } let entry = cursor.getCurrent(); return [entry.key, entry.value]; } async get(key: K): Promise { let cursor = await this.sequence.newCursorAt(this.cs, key); if (!cursor.valid) { return undefined; } let entry = cursor.getCurrent(); return equals(entry.key, key) ? entry.value : undefined; } async forEach(cb: (v: V, k: K) => void): Promise { let cursor = await this.sequence.newCursorAt(this.cs, null); return cursor.iter(entry => { cb(entry.value, entry.key); return false; }); } get size(): number { if (this.sequence instanceof MapLeafSequence) { return this.sequence.items.length; } throw new Error('Not implemented'); } } export class MapLeafSequence extends OrderedSequence> { getKey(idx: number): K { return this.items[idx].key; } }