From 037e2c575c367666a952f99ea4d9cc42268cedec Mon Sep 17 00:00:00 2001 From: rubytree Date: Sun, 30 Apr 2023 13:09:26 +0200 Subject: `dynamic.tupleN/2` optimization --- src/gleam_stdlib.mjs | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'src/gleam_stdlib.mjs') 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) { -- cgit v1.2.3