diff --git a/src/prelude/dict.ts b/src/prelude/dict.ts index b3ee271..9642a15 100644 --- a/src/prelude/dict.ts +++ b/src/prelude/dict.ts @@ -1,9 +1,16 @@ +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) => { @@ -22,3 +29,7 @@ export const dict = { }, 'from-entries': (entries: [string, any][]) => Object.fromEntries(entries), } + + // raw functions deal directly in Value types, meaning we can modify collection + // careful - the MUST return a Value! + ; (dict.set as any).raw = true diff --git a/src/prelude/tests/prelude.test.ts b/src/prelude/tests/prelude.test.ts index 90ea2c6..e19e18e 100644 --- a/src/prelude/tests/prelude.test.ts +++ b/src/prelude/tests/prelude.test.ts @@ -471,6 +471,12 @@ describe('dict operations', () => { await expect(`dict.get [a=1] 'b' 99`).toEvaluateTo(99, globals) }) + test('dict.set sets value', async () => { + await expect(`map = [a=1]; dict.set map 'b' 99; map.b`).toEvaluateTo(99, globals) + await expect(`map = [a=1]; dict.set map 'a' 100; map.a`).toEvaluateTo(100, globals) + }) + + test('dict.empty? checks if dict is empty', async () => { await expect(`dict.empty? [=]`).toEvaluateTo(true, globals) await expect(`dict.empty? [a=1]`).toEvaluateTo(false, globals)