diff options
author | rubytree <rt@rubytree.me> | 2023-04-30 13:09:26 +0200 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-05-13 16:32:38 +0100 |
commit | 037e2c575c367666a952f99ea4d9cc42268cedec (patch) | |
tree | fe0857f1ac1593696bfbad333c14e1ee3881cc1c /src/gleam_stdlib.mjs | |
parent | 37b4a44fe8f63b6314f3611f8ec3dab820f34e3a (diff) | |
download | gleam_stdlib-037e2c575c367666a952f99ea4d9cc42268cedec.tar.gz gleam_stdlib-037e2c575c367666a952f99ea4d9cc42268cedec.zip |
`dynamic.tupleN/2` optimization
Diffstat (limited to 'src/gleam_stdlib.mjs')
-rw-r--r-- | src/gleam_stdlib.mjs | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index 102158c..d9825e7 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -616,8 +616,47 @@ export function decode_tuple(data) { return Array.isArray(data) ? new Ok(data) : decoder_error("Tuple", data); } -export function list_to_tuple(data) { - return List.isList(data) ? new Ok([...data]) : decoder_error("List", data); +export function decode_tuple2(data) { + return decode_tupleN(data, 2); +} + +export function decode_tuple3(data) { + return decode_tupleN(data, 3); +} + +export function decode_tuple4(data) { + return decode_tupleN(data, 4); +} + +export function decode_tuple5(data) { + return decode_tupleN(data, 5); +} + +export function decode_tuple6(data) { + return decode_tupleN(data, 6); +} + +function decode_tupleN(data, n) { + let error_message = `Tuple or List of ${n} elements`; + + if (!(List.isList(data) || Array.isArray(data))) { + return decoder_error(error_message, data); + } + + let array = List.isList(data) ? [...data] : data; + + let i = 0; + for (; i < n; i++) { + if (array[i] === undefined) { + return decoder_error(error_message, data); + } + } + + if (array[i] === undefined) { + return new Ok(array); + } else { + return decoder_error(error_message, data); + } } export function tuple_get(data, index) { |