aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2023-06-21 17:21:30 +0100
committerLouis Pilfold <louis@lpil.uk>2023-06-21 17:21:30 +0100
commit900174737fe9d099ffa6bd78c95ba4e8abad2c31 (patch)
treecb944d660ebf66f9c95bc768be4ad62869136248 /src
parent0449a9b9a120afc24a7cfdcbdc1eee023cf7cf11 (diff)
downloadgleam_stdlib-900174737fe9d099ffa6bd78c95ba4e8abad2c31.tar.gz
gleam_stdlib-900174737fe9d099ffa6bd78c95ba4e8abad2c31.zip
string.byte_size
Diffstat (limited to 'src')
-rw-r--r--src/gleam/string.gleam19
-rw-r--r--src/gleam_stdlib.erl1
-rw-r--r--src/gleam_stdlib.mjs4
3 files changed, 23 insertions, 1 deletions
diff --git a/src/gleam/string.gleam b/src/gleam/string.gleam
index 89efb5d..b20e726 100644
--- a/src/gleam/string.gleam
+++ b/src/gleam/string.gleam
@@ -1025,3 +1025,22 @@ if erlang {
external fn do_inspect(term: anything) -> StringBuilder =
"gleam_stdlib" "inspect"
}
+
+/// Returns the number of bytes in a `String`.
+///
+/// This function runs in constant time on Erlang and in linear time on
+/// JavaScript.
+///
+pub fn byte_size(string: String) -> Int {
+ do_byte_size(string)
+}
+
+if javascript {
+ external fn do_byte_size(String) -> Int =
+ "../gleam_stdlib.mjs" "byte_size"
+}
+
+if erlang {
+ external fn do_byte_size(String) -> Int =
+ "erlang" "byte_size"
+}
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index e891202..6967cf4 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -439,4 +439,3 @@ inspect_maybe_utf8_string(Binary, Acc) ->
float_to_string(Float) when is_float(Float) ->
erlang:iolist_to_binary(io_lib_format:fwrite_g(Float)).
-
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index a3abe68..4fd06d9 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -733,3 +733,7 @@ function try_get_field(value, field, or_else) {
return or_else();
}
}
+
+export function byte_size(string) {
+ return new TextEncoder().encode(string).length;
+}