aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gleam_stdlib.erl10
-rw-r--r--src/gleam_stdlib.mjs33
2 files changed, 23 insertions, 20 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index 79ded3f..e891202 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -99,23 +99,23 @@ decode_tuple(Data) -> decode_error_msg(<<"Tuple">>, Data).
decode_tuple2({_,_} = A) -> {ok, A};
decode_tuple2([A,B]) -> {ok, {A,B}};
-decode_tuple2(Data) -> decode_error_msg(<<"Tuple or List of 2 elements">>, Data).
+decode_tuple2(Data) -> decode_error_msg(<<"Tuple of 2 elements">>, Data).
decode_tuple3({_,_,_} = A) -> {ok, A};
decode_tuple3([A,B,C]) -> {ok, {A,B,C}};
-decode_tuple3(Data) -> decode_error_msg(<<"Tuple or List of 3 elements">>, Data).
+decode_tuple3(Data) -> decode_error_msg(<<"Tuple of 3 elements">>, Data).
decode_tuple4({_,_,_,_} = A) -> {ok, A};
decode_tuple4([A,B,C,D]) -> {ok, {A,B,C,D}};
-decode_tuple4(Data) -> decode_error_msg(<<"Tuple or List of 4 elements">>, Data).
+decode_tuple4(Data) -> decode_error_msg(<<"Tuple of 4 elements">>, Data).
decode_tuple5({_,_,_,_,_} = A) -> {ok, A};
decode_tuple5([A,B,C,D,E]) -> {ok, {A,B,C,D,E}};
-decode_tuple5(Data) -> decode_error_msg(<<"Tuple or List of 5 elements">>, Data).
+decode_tuple5(Data) -> decode_error_msg(<<"Tuple of 5 elements">>, Data).
decode_tuple6({_,_,_,_,_,_} = A) -> {ok, A};
decode_tuple6([A,B,C,D,E,F]) -> {ok, {A,B,C,D,E,F}};
-decode_tuple6(Data) -> decode_error_msg(<<"Tuple or List of 6 elements">>, Data).
+decode_tuple6(Data) -> decode_error_msg(<<"Tuple of 6 elements">>, Data).
decode_option(Term, F) ->
Decode = fun(Inner) ->
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index d9825e7..7c41cdd 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -637,26 +637,29 @@ export function decode_tuple6(data) {
}
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);
+ if (Array.isArray(data) && data.length == n) {
+ return new Ok(data)
}
- let array = List.isList(data) ? [...data] : data;
+ let list = decode_exact_length_list(data, n)
+ if (list) return new Ok(list)
- let i = 0;
- for (; i < n; i++) {
- if (array[i] === undefined) {
- return decoder_error(error_message, data);
- }
- }
+ return decoder_error(`Tuple of ${n} elements`, data);
+}
- if (array[i] === undefined) {
- return new Ok(array);
- } else {
- return decoder_error(error_message, data);
+function decode_exact_length_list(data, n) {
+ if (!List.isList(data)) return;
+
+ let elements = []
+ let current = data
+
+ for (let i = 0; i < n; i++) {
+ if (current.isEmpty()) break;
+ elements.push(current.head)
+ current = current.tail
}
+
+ if (elements.length === n && current.isEmpty()) return elements
}
export function tuple_get(data, index) {