Skip to content

Commit

Permalink
Optimise string trimming on JavaScript
Browse files Browse the repository at this point in the history
  • Loading branch information
richard-viney committed Nov 25, 2024
1 parent 8349133 commit 5e9c98b
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 5 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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`
Expand Down
13 changes: 8 additions & 5 deletions src/gleam_stdlib.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
17 changes: 17 additions & 0 deletions test/gleam/string_test.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down

0 comments on commit 5e9c98b

Please sign in to comment.