aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Viney <richard.viney@gmail.com>2024-11-12 11:49:30 +1300
committerLouis Pilfold <louis@lpil.uk>2024-11-26 13:37:23 +0000
commitb0afb8f5522ab96b54580dfe94ec045da0f758aa (patch)
treeaf1a49d6f78c6aa035e8b9746e42091335d1035e
parent8349133498dbd595b82c783d8e11d530689eeb35 (diff)
downloadgleam_stdlib-b0afb8f5522ab96b54580dfe94ec045da0f758aa.tar.gz
gleam_stdlib-b0afb8f5522ab96b54580dfe94ec045da0f758aa.zip
Optimise string trimming on JavaScript
-rw-r--r--CHANGELOG.md5
-rw-r--r--src/gleam_stdlib.mjs13
-rw-r--r--test/gleam/string_test.gleam17
3 files changed, 30 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 63a148b..16f2acd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
# Changelog
+## Unreleased
+
+- The performance of `string.trim`, `string.trim_start`, and `string.trim_end`
+ has been improved on JavaScript.
+
## v0.44.0 - 2024-11-25
- The `gleam/queue` module has been deprecated in favour of the `gleam_deque`
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index 46bc72a..06302bf 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -302,19 +302,22 @@ const unicode_whitespaces = [
"\u2029", // Paragraph separator
].join("");
-const left_trim_regex = new RegExp(`^([${unicode_whitespaces}]*)`, "g");
-const right_trim_regex = new RegExp(`([${unicode_whitespaces}]*)$`, "g");
+const trim_start_regex = new RegExp(`^[${unicode_whitespaces}]*`);
+const trim_end_regex = new RegExp(`[${unicode_whitespaces}]*$`);
+const trim_regex = new RegExp(
+ `^[${unicode_whitespaces}]*(.*?)[${unicode_whitespaces}]*$`
+);
export function trim(string) {
- return trim_start(trim_end(string));
+ return string.match(trim_regex)[1];
}
export function trim_start(string) {
- return string.replace(left_trim_regex, "");
+ return string.replace(trim_start_regex, "");
}
export function trim_end(string) {
- return string.replace(right_trim_regex, "");
+ return string.replace(trim_end_regex, "");
}
export function bit_array_from_string(string) {
diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam
index b98a4e1..641d64d 100644
--- a/test/gleam/string_test.gleam
+++ b/test/gleam/string_test.gleam
@@ -179,6 +179,23 @@ pub fn trim_end_test() {
|> should.equal(" hats")
}
+pub fn trim_whole_string_test() {
+ let s =
+ "\u{0020}\u{0009}\u{000A}\u{000B}\u{000C}\u{000D}\u{0085}\u{2028}\u{2029}"
+
+ s
+ |> string.trim_start
+ |> should.equal("")
+
+ s
+ |> string.trim_end
+ |> should.equal("")
+
+ s
+ |> string.trim
+ |> should.equal("")
+}
+
// unicode whitespaces
pub fn trim_horizontal_tab_test() {
"hats\u{0009}"