import { type Value, toString, toValue } from 'reefvm' export const dict = { keys: (dict: Record) => Object.keys(dict), values: (dict: Record) => Object.values(dict), entries: (dict: Record) => Object.entries(dict).map(([k, v]) => ({ key: k, value: v })), 'has?': (dict: Record, key: string) => key in dict, get: (dict: Record, key: string, defaultValue: any = null) => dict[key] ?? defaultValue, set: (dict: Value, key: Value, value: Value) => { const map = dict.value as Map map.set(toString(key), value) return dict }, merge: (...dicts: Record[]) => Object.assign({}, ...dicts), 'empty?': (dict: Record) => Object.keys(dict).length === 0, map: async (dict: Record, cb: Function) => { const result: Record = {} for (const [key, value] of Object.entries(dict)) { result[key] = await cb(value, key) } return result }, filter: async (dict: Record, cb: Function) => { const result: Record = {} for (const [key, value] of Object.entries(dict)) { if (await cb(value, key)) result[key] = value } return result }, 'from-entries': (entries: [string, any][]) => Object.fromEntries(entries), } // raw functions deal directly in Value types, meaning we can modify collection // careful - they MUST return a Value! ; (dict.set as any).raw = true