Skip to content

Commit 9001747

Browse files
committed
string.byte_size
1 parent 0449a9b commit 9001747

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

src/gleam/string.gleam

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,3 +1025,22 @@ if erlang {
10251025
external fn do_inspect(term: anything) -> StringBuilder =
10261026
"gleam_stdlib" "inspect"
10271027
}
1028+
1029+
/// Returns the number of bytes in a `String`.
1030+
///
1031+
/// This function runs in constant time on Erlang and in linear time on
1032+
/// JavaScript.
1033+
///
1034+
pub fn byte_size(string: String) -> Int {
1035+
do_byte_size(string)
1036+
}
1037+
1038+
if javascript {
1039+
external fn do_byte_size(String) -> Int =
1040+
"../gleam_stdlib.mjs" "byte_size"
1041+
}
1042+
1043+
if erlang {
1044+
external fn do_byte_size(String) -> Int =
1045+
"erlang" "byte_size"
1046+
}

src/gleam_stdlib.erl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,4 +439,3 @@ inspect_maybe_utf8_string(Binary, Acc) ->
439439

440440
float_to_string(Float) when is_float(Float) ->
441441
erlang:iolist_to_binary(io_lib_format:fwrite_g(Float)).
442-

src/gleam_stdlib.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,3 +733,7 @@ function try_get_field(value, field, or_else) {
733733
return or_else();
734734
}
735735
}
736+
737+
export function byte_size(string) {
738+
return new TextEncoder().encode(string).length;
739+
}

test/gleam/string_test.gleam

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,3 +985,17 @@ if erlang {
985985
) -> List(anything) =
986986
"gleam_stdlib_test_ffi" "improper_list_append"
987987
}
988+
989+
pub fn byte_size_test() {
990+
let assert 0 = string.byte_size("")
991+
let assert 1 = string.byte_size("a")
992+
let assert 2 = string.byte_size("ab")
993+
let assert 3 = string.byte_size("abc")
994+
995+
// Unicode graphemes. These will be multiple bytes.
996+
let assert 1 = string.byte_size("a")
997+
let assert 2 = string.byte_size("ä")
998+
let assert 4 = string.byte_size("👩")
999+
let assert 8 = string.byte_size("👩🏾")
1000+
let assert 15 = string.byte_size("👩🏾‍🦰")
1001+
}

0 commit comments

Comments
 (0)