diff --git a/src/interpreter/lib/std.ts b/src/interpreter/lib/std.ts index 529ef26f..13648a16 100644 --- a/src/interpreter/lib/std.ts +++ b/src/interpreter/lib/std.ts @@ -406,8 +406,21 @@ export const std: Record = { }) )); }), + + 'Obj:from_kvs': FN_NATIVE(([kvs]) => { + assertArray(kvs); + return OBJ(new Map( + kvs.value.map((kv) => { + assertArray(kv); + const [key, value] = kv.value; + assertString(key); + expectAny(value); + return [key.value, value]; + }), + )); + }), //#endregion - + //#region Error 'Error:create': FN_NATIVE(([name, info]) => { assertString(name); diff --git a/test/std.ts b/test/std.ts index 4588e1a8..3018a11f 100644 --- a/test/std.ts +++ b/test/std.ts @@ -208,6 +208,15 @@ describe('Obj', () => { `); eq(res, utils.jsToVal({ b: 2, d: null })); }); + + test.concurrent('from_kvs', async () => { + const res = await exe(` + let kvs = [['a', 1], ['b', 2], ['c', 3]] + + <: Obj:from_kvs(kvs) + `); + eq(res, utils.jsToVal({ a: 1, b: 2, c: 3 })); + }); }); describe('Str', () => { diff --git a/unreleased/obj-from-kvs.md b/unreleased/obj-from-kvs.md new file mode 100644 index 00000000..d6ed002f --- /dev/null +++ b/unreleased/obj-from-kvs.md @@ -0,0 +1 @@ +- 関数`Obj:from_kvs`を追加