aboutsummaryrefslogtreecommitdiff
path: root/src/gleam_stdlib.mjs
diff options
context:
space:
mode:
authorrubytree <rt@rubytree.me>2023-04-30 13:09:26 +0200
committerLouis Pilfold <louis@lpil.uk>2023-05-13 16:32:38 +0100
commit037e2c575c367666a952f99ea4d9cc42268cedec (patch)
treefe0857f1ac1593696bfbad333c14e1ee3881cc1c /src/gleam_stdlib.mjs
parent37b4a44fe8f63b6314f3611f8ec3dab820f34e3a (diff)
downloadgleam_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.mjs43
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) {