aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2021-09-09 20:01:04 +0100
committerLouis Pilfold <louis@lpil.uk>2021-09-09 20:01:04 +0100
commit749ac8290d1e3d09e2287056f618d6df91f4e01b (patch)
treeb88abc0b15c54708d376bf35c0b8b1575dcb7d0b
parentae269282095ba1180952dd1eab58830bf5a19ed2 (diff)
downloadgleam_stdlib-749ac8290d1e3d09e2287056f618d6df91f4e01b.tar.gz
gleam_stdlib-749ac8290d1e3d09e2287056f618d6df91f4e01b.zip
JS dynamic bool
-rw-r--r--src/gleam/dynamic.gleam35
-rw-r--r--src/gleam_stdlib.js8
-rw-r--r--test/gleam/dynamic_test.gleam43
3 files changed, 54 insertions, 32 deletions
diff --git a/src/gleam/dynamic.gleam b/src/gleam/dynamic.gleam
index d4afca0..86d1b6e 100644
--- a/src/gleam/dynamic.gleam
+++ b/src/gleam/dynamic.gleam
@@ -159,21 +159,32 @@ if javascript {
"../gleam_stdlib.js" "decode_float"
}
+/// Checks to see whether a Dynamic value is an bool, and return the bool if
+/// it is.
+///
+/// ## Examples
+///
+/// > bool(from(True))
+/// Ok(True)
+///
+/// > bool(from(123))
+/// Error(DecodeError(expected: "bool", found: "Int"))
+///
+pub fn bool(from data: Dynamic) -> Result(Bool, DecodeError) {
+ decode_bool(data)
+}
+
if erlang {
- /// Checks to see whether a Dynamic value is an bool, and return the bool if
- /// it is.
- ///
- /// ## Examples
- ///
- /// > bool(from(True))
- /// Ok(True)
- ///
- /// > bool(from(123))
- /// Error(DecodeError(expected: "bool", found: "Int"))
- ///
- pub external fn bool(from: Dynamic) -> Result(Bool, DecodeError) =
+ external fn decode_bool(Dynamic) -> Result(Bool, DecodeError) =
"gleam_stdlib" "decode_bool"
+}
+if javascript {
+ external fn decode_bool(Dynamic) -> Result(Bool, DecodeError) =
+ "../gleam_stdlib.js" "decode_bool"
+}
+
+if erlang {
/// Checks to see whether a Dynamic value is a list, and return the list if it
/// is.
///
diff --git a/src/gleam_stdlib.js b/src/gleam_stdlib.js
index cfe26a2..b8feecf 100644
--- a/src/gleam_stdlib.js
+++ b/src/gleam_stdlib.js
@@ -476,8 +476,11 @@ function classify_dynamic(data) {
return "List";
} else if (Number.isInteger(data)) {
return "Int";
+ } else if (typeof data === "number") {
+ return "Float";
} else {
- return typeof data;
+ let type = typeof data;
+ return type.charAt(0).toUpperCase() + type.slice(1);
}
}
@@ -498,3 +501,6 @@ export function decode_int(data) {
export function decode_float(data) {
return typeof data === "number" ? new Ok(data) : decoder_error("Float", data);
}
+export function decode_bool(data) {
+ return typeof data === "boolean" ? new Ok(data) : decoder_error("Bool", data);
+}
diff --git a/test/gleam/dynamic_test.gleam b/test/gleam/dynamic_test.gleam
index 3235fe6..3229e3d 100644
--- a/test/gleam/dynamic_test.gleam
+++ b/test/gleam/dynamic_test.gleam
@@ -129,29 +129,34 @@ if javascript {
}
}
-if erlang {
- pub fn bool_test() {
- True
- |> dynamic.from
- |> dynamic.bool
- |> should.equal(Ok(True))
+pub fn bool_test() {
+ True
+ |> dynamic.from
+ |> dynamic.bool
+ |> should.equal(Ok(True))
- False
- |> dynamic.from
- |> dynamic.bool
- |> should.equal(Ok(False))
+ False
+ |> dynamic.from
+ |> dynamic.bool
+ |> should.equal(Ok(False))
- 1
- |> dynamic.from
- |> dynamic.bool
- |> should.equal(Error(DecodeError(expected: "Bool", found: "Int")))
+ 1
+ |> dynamic.from
+ |> dynamic.bool
+ |> should.equal(Error(DecodeError(expected: "Bool", found: "Int")))
- []
- |> dynamic.from
- |> dynamic.bool
- |> should.equal(Error(DecodeError(expected: "Bool", found: "List")))
- }
+ 1.5
+ |> dynamic.from
+ |> dynamic.bool
+ |> should.equal(Error(DecodeError(expected: "Bool", found: "Float")))
+ []
+ |> dynamic.from
+ |> dynamic.bool
+ |> should.equal(Error(DecodeError(expected: "Bool", found: "List")))
+}
+
+if erlang {
pub fn typed_list_test() {
[]
|> dynamic.from