From 9d4781c0f4e760afd8f88d53d01df66bbeb46462 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Thu, 3 Oct 2019 21:15:02 +0200 Subject: [PATCH 1/2] Added support for array.find --- src/LuaLib.ts | 1 + src/LuaTransformer.ts | 2 ++ src/lualib/ArrayFind.ts | 14 ++++++++++++++ test/unit/builtins/array.spec.ts | 16 ++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 src/lualib/ArrayFind.ts diff --git a/src/LuaLib.ts b/src/LuaLib.ts index 050e1eaf3..9d15f9fb4 100644 --- a/src/LuaLib.ts +++ b/src/LuaLib.ts @@ -6,6 +6,7 @@ export enum LuaLibFeature { ArrayEvery = "ArrayEvery", ArrayFilter = "ArrayFilter", ArrayForEach = "ArrayForEach", + ArrayFind = "ArrayFind", ArrayFindIndex = "ArrayFindIndex", ArrayIndexOf = "ArrayIndexOf", ArrayMap = "ArrayMap", diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index fcb8c4cd0..cff5f45df 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -5113,6 +5113,8 @@ export class LuaTransformer { ); case "forEach": return this.transformLuaLibFunction(LuaLibFeature.ArrayForEach, node, caller, ...params); + case "find": + return this.transformLuaLibFunction(LuaLibFeature.ArrayFind, node, caller, ...params); case "findIndex": return this.transformLuaLibFunction(LuaLibFeature.ArrayFindIndex, node, caller, ...params); case "indexOf": diff --git a/src/lualib/ArrayFind.ts b/src/lualib/ArrayFind.ts new file mode 100644 index 000000000..66970122a --- /dev/null +++ b/src/lualib/ArrayFind.ts @@ -0,0 +1,14 @@ +// https://www.ecma-international.org/ecma-262/10.0/index.html#sec-array.prototype.find +function __TS__ArrayFind(this: void, arr: T[], callbackFn: (element: T, index?: number, array?: T[]) => boolean): T { + const len = arr.length; + let k = 0; + while (k < len) { + const elem = arr[k]; + if (callbackFn(elem, k, arr)) { + return elem; + } + k = k + 1; + } + + return undefined; +} diff --git a/test/unit/builtins/array.spec.ts b/test/unit/builtins/array.spec.ts index edac44090..3171eb805 100644 --- a/test/unit/builtins/array.spec.ts +++ b/test/unit/builtins/array.spec.ts @@ -246,9 +246,25 @@ test("array.forEach (%p)", () => { `.expectToMatchJsResult(); }); +test.each([ + { array: [], predicate: "elem > 3" }, + { array: [0, 2, 4, 8], predicate: "elem > 10" }, + { array: [0, 2, 4, 8], predicate: "elem > 7" }, + { array: [0, 2, 4, 8], predicate: "elem == 0" }, + { array: [0, 2, 4, 8], predicate: "elem > 7" }, + { array: [0, 2, 4, 8], predicate: "true" }, + { array: [0, 2, 4, 8], predicate: "false" }, +])("array.find (%p)", ({ array, predicate }) => { + util.testFunction` + const array = ${util.valueToString(array)}; + return array.find((elem, index, arr) => ${predicate} && arr[index] === elem); + `.expectToMatchJsResult(); +}); + test.each([ { array: [], searchElement: 3 }, { array: [0, 2, 4, 8], searchElement: 10 }, + { array: [0, 2, 4, 8], searchElement: 0 }, { array: [0, 2, 4, 8], searchElement: 8 }, ])("array.findIndex (%p)", ({ array, searchElement }) => { util.testFunction` From 1fa4a1e0be3526241bd2ca60aa7f56e774dfa667 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sat, 5 Oct 2019 15:49:12 +0200 Subject: [PATCH 2/2] Changed lualib function signature to match TS lib --- src/lualib/ArrayFind.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lualib/ArrayFind.ts b/src/lualib/ArrayFind.ts index 66970122a..370200df1 100644 --- a/src/lualib/ArrayFind.ts +++ b/src/lualib/ArrayFind.ts @@ -1,10 +1,14 @@ // https://www.ecma-international.org/ecma-262/10.0/index.html#sec-array.prototype.find -function __TS__ArrayFind(this: void, arr: T[], callbackFn: (element: T, index?: number, array?: T[]) => boolean): T { +function __TS__ArrayFind( + this: void, + arr: T[], + predicate: (value: T, index: number, obj: T[]) => unknown +): T | undefined { const len = arr.length; let k = 0; while (k < len) { const elem = arr[k]; - if (callbackFn(elem, k, arr)) { + if (predicate(elem, k, arr)) { return elem; } k = k + 1;