From 11cd7ad814e1740074fa4e3a02cdb6e6a07f38d9 Mon Sep 17 00:00:00 2001 From: salano_ym <53254905+salano-ym@users.noreply.github.com> Date: Thu, 11 Apr 2024 07:41:40 +0000 Subject: [PATCH 1/2] arr.every --- CHANGELOG.md | 1 + docs/primitive-props.md | 3 +++ src/interpreter/primitive-props.ts | 11 +++++++++++ test/index.ts | 16 ++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89464f88..52be6513 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - `Date:millisecond`を追加 - `arr.fill`, `arr.repeat`, `Arr:create`を追加 - JavaScriptのように分割代入ができるように(現段階では機能は最小限) +- `arr.every`を追加 # 0.17.0 - `package.json`を修正 diff --git a/docs/primitive-props.md b/docs/primitive-props.md index 0c9c2919..0763a229 100644 --- a/docs/primitive-props.md +++ b/docs/primitive-props.md @@ -184,6 +184,9 @@ _fromIndex_ および _toIndex_ に関する挙動は`arr.slice`に準拠しま `arr.copy`同様シャローコピーであり、配列やオブジェクトの参照は維持されます。 _times_ には0以上の整数値を指定します。それ以外ではエラーになります。 +### @(_v_: arr).every(_func_: @(_item_: value, _index_: num) { bool }): bool +配列の全ての要素に対して _func_ が true を返す時のみ true 返します。空配列には常に true を返します。 + ## エラー型 ### #(_v_: error).name 型: `str` diff --git a/src/interpreter/primitive-props.ts b/src/interpreter/primitive-props.ts index 911313ac..572f1e7f 100644 --- a/src/interpreter/primitive-props.ts +++ b/src/interpreter/primitive-props.ts @@ -279,6 +279,17 @@ const PRIMITIVE_PROPS: { throw e; } }), + + every: (target: VArr): VFn => FN_NATIVE(async ([fn], opts) => { + assertFunction(fn); + for (let i = 0; i < target.value.length; i++) { + const item = target.value[i]!; + const res = await opts.call(fn, [item, NUM(i)]); + assertBoolean(res); + if (!res.value) return FALSE; + } + return TRUE; + }), }, error: { diff --git a/test/index.ts b/test/index.ts index 5d4634e9..efa4c38f 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2849,6 +2849,22 @@ describe('primitive props', () => { ARR([]), ])); }); + + test.concurrent('every', async () => { + const res = await exe(` + let arr1 = [0, 1, 2, 3] + let res1 = arr1.every(@(v,i){v==0 || i > 0}) + let res2 = arr1.every(@(v,i){v==0 && i > 0}) + let res3 = [].every(@(v,i){false}) + <: [arr1, res1, res2, res3] + `); + eq(res, ARR([ + ARR([NUM(0), NUM(1), NUM(2), NUM(3)]), // target not changed + TRUE, + FALSE, + TRUE, + ])); + }); }); }); From ecdb0fe7c4ea11c601f12e49a1b88709e1a653d5 Mon Sep 17 00:00:00 2001 From: salano_ym <53254905+salano-ym@users.noreply.github.com> Date: Thu, 11 Apr 2024 07:42:18 +0000 Subject: [PATCH 2/2] arr.some --- CHANGELOG.md | 2 +- docs/primitive-props.md | 3 +++ src/interpreter/primitive-props.ts | 11 +++++++++++ test/index.ts | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52be6513..cef1d175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ - `Date:millisecond`を追加 - `arr.fill`, `arr.repeat`, `Arr:create`を追加 - JavaScriptのように分割代入ができるように(現段階では機能は最小限) -- `arr.every`を追加 +- `arr.every`, `arr.some`を追加 # 0.17.0 - `package.json`を修正 diff --git a/docs/primitive-props.md b/docs/primitive-props.md index 0763a229..609cc6ee 100644 --- a/docs/primitive-props.md +++ b/docs/primitive-props.md @@ -187,6 +187,9 @@ _times_ には0以上の整数値を指定します。それ以外ではエラ ### @(_v_: arr).every(_func_: @(_item_: value, _index_: num) { bool }): bool 配列の全ての要素に対して _func_ が true を返す時のみ true 返します。空配列には常に true を返します。 +### @(_v_: arr).some(_func_: @(_item_: value, _index_: num) { bool }): bool +配列の要素に対して _func_ が true を返す要素が存在する時のみ true 返します。 + ## エラー型 ### #(_v_: error).name 型: `str` diff --git a/src/interpreter/primitive-props.ts b/src/interpreter/primitive-props.ts index 572f1e7f..c154c45a 100644 --- a/src/interpreter/primitive-props.ts +++ b/src/interpreter/primitive-props.ts @@ -290,6 +290,17 @@ const PRIMITIVE_PROPS: { } return TRUE; }), + + some: (target: VArr): VFn => FN_NATIVE(async ([fn], opts) => { + assertFunction(fn); + for (let i = 0; i < target.value.length; i++) { + const item = target.value[i]!; + const res = await opts.call(fn, [item, NUM(i)]); + assertBoolean(res); + if (res.value) return TRUE; + } + return FALSE; + }), }, error: { diff --git a/test/index.ts b/test/index.ts index efa4c38f..7b76e376 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2865,6 +2865,20 @@ describe('primitive props', () => { TRUE, ])); }); + + test.concurrent('some', async () => { + const res = await exe(` + let arr1 = [0, 1, 2, 3] + let res1 = arr1.some(@(v,i){v%2==0 && i <= 2}) + let res2 = arr1.some(@(v,i){v%2==0 && i > 2}) + <: [arr1, res1, res2] + `); + eq(res, ARR([ + ARR([NUM(0), NUM(1), NUM(2), NUM(3)]), // target not changed + TRUE, + FALSE, + ])); + }); }); });