diff options
author | Louis Pilfold <louis@lpil.uk> | 2024-03-05 22:09:22 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2024-03-05 22:09:22 +0000 |
commit | b6894463caede28c8bce527c343895e28026f894 (patch) | |
tree | 9221ac307226a49fa7b892db947e8d1727bfb5aa /src | |
parent | 15af4b029e9240396c15e276c6bc53f31b1a576b (diff) | |
download | gleam_stdlib-b6894463caede28c8bce527c343895e28026f894.tar.gz gleam_stdlib-b6894463caede28c8bce527c343895e28026f894.zip |
Remove some indirection
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/list.gleam | 49 | ||||
-rw-r--r-- | src/gleam/string_builder.gleam | 43 | ||||
-rw-r--r-- | src/gleam_stdlib.erl | 5 | ||||
-rw-r--r-- | src/gleam_stdlib.mjs | 6 |
4 files changed, 21 insertions, 82 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam index 251c0bc..d495dda 100644 --- a/src/gleam/list.gleam +++ b/src/gleam/list.gleam @@ -53,23 +53,14 @@ import gleam/dict.{type Dict} /// // -> 2 /// ``` /// -pub fn length(of list: List(a)) -> Int { - do_length(list) -} - -@target(erlang) @external(erlang, "erlang", "length") -fn do_length(a: List(a)) -> Int - -@target(javascript) -fn do_length(list: List(a)) -> Int { - do_length_acc(list, 0) +pub fn length(of list: List(a)) -> Int { + count_length(list, 0) } -@target(javascript) -fn do_length_acc(list: List(a), count: Int) -> Int { +fn count_length(list: List(a), count: Int) -> Int { case list { - [_, ..list] -> do_length_acc(list, count + 1) + [_, ..list] -> count_length(list, count + 1) _ -> count } } @@ -100,24 +91,15 @@ fn do_length_acc(list: List(a), count: Int) -> Int { /// // -> [2, 1] /// ``` /// -pub fn reverse(xs: List(a)) -> List(a) { - do_reverse(xs) -} - -@target(erlang) @external(erlang, "lists", "reverse") -fn do_reverse(a: List(a)) -> List(a) - -@target(javascript) -fn do_reverse(list) { - do_reverse_acc(list, []) +pub fn reverse(xs: List(a)) -> List(a) { + do_reverse(xs, []) } -@target(javascript) -fn do_reverse_acc(remaining, accumulator) { +fn do_reverse(remaining, accumulator) { case remaining { [] -> accumulator - [item, ..rest] -> do_reverse_acc(rest, [item, ..accumulator]) + [item, ..rest] -> do_reverse(rest, [item, ..accumulator]) } } @@ -611,24 +593,15 @@ pub fn new() -> List(a) { /// // -> [1, 2, 3] /// ``` /// +@external(erlang, "lists", "append") pub fn append(first: List(a), second: List(a)) -> List(a) { - do_append(first, second) + do_append(reverse(first), second) } -@target(erlang) -@external(erlang, "lists", "append") -fn do_append(a: List(a), b: List(a)) -> List(a) - -@target(javascript) fn do_append(first: List(a), second: List(a)) -> List(a) { - do_append_acc(reverse(first), second) -} - -@target(javascript) -fn do_append_acc(first: List(a), second: List(a)) -> List(a) { case first { [] -> second - [item, ..rest] -> do_append_acc(rest, [item, ..second]) + [item, ..rest] -> do_append(rest, [item, ..second]) } } diff --git a/src/gleam/string_builder.gleam b/src/gleam/string_builder.gleam index 06916bc..960a36f 100644 --- a/src/gleam/string_builder.gleam +++ b/src/gleam/string_builder.gleam @@ -209,36 +209,14 @@ fn do_split( /// Replaces all instances of a pattern with a given string substitute. /// +@external(erlang, "gleam_stdlib", "string_replace") +@external(javascript, "../gleam_stdlib.mjs", "string_replace") pub fn replace( in builder: StringBuilder, each pattern: String, with substitute: String, -) -> StringBuilder { - do_replace(builder, pattern, substitute) -} - -@target(erlang) -fn do_replace( - iodata: StringBuilder, - pattern: String, - substitute: String, -) -> StringBuilder { - erl_replace(iodata, pattern, substitute, All) -} - -@target(erlang) -@external(erlang, "string", "replace") -fn erl_replace( - a: StringBuilder, - b: String, - c: String, - d: Direction, ) -> StringBuilder -@target(javascript) -@external(javascript, "../gleam_stdlib.mjs", "string_replace") -fn do_replace(a: StringBuilder, b: String, c: String) -> StringBuilder - /// Compares two builders to determine if they have the same textual content. /// /// Comparing two iodata using the `==` operator may return `False` even if they @@ -257,14 +235,11 @@ fn do_replace(a: StringBuilder, b: String, c: String) -> StringBuilder /// // -> True /// ``` /// +@external(erlang, "string", "equal") pub fn is_equal(a: StringBuilder, b: StringBuilder) -> Bool { - do_is_equal(a, b) + a == b } -@external(erlang, "string", "equal") -@external(javascript, "../gleam_stdlib.mjs", "equal") -fn do_is_equal(a: StringBuilder, b: StringBuilder) -> Bool - /// Inspects a builder to determine if it is equivalent to an empty string. /// /// ## Examples @@ -284,15 +259,7 @@ fn do_is_equal(a: StringBuilder, b: StringBuilder) -> Bool /// // -> True /// ``` /// -pub fn is_empty(builder: StringBuilder) -> Bool { - do_is_empty(builder) -} - -@target(erlang) @external(erlang, "string", "is_empty") -fn do_is_empty(a: StringBuilder) -> Bool - -@target(javascript) -fn do_is_empty(builder: StringBuilder) -> Bool { +pub fn is_empty(builder: StringBuilder) -> Bool { from_string("") == builder } diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index 433b4d4..a308f3e 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -13,7 +13,7 @@ decode_tuple5/1, decode_tuple6/1, tuple_get/2, classify_dynamic/1, print/1, println/1, print_error/1, println_error/1, inspect/1, float_to_string/1, int_from_base_string/2, utf_codepoint_list_to_string/1, contains_string/2, - crop_string/2, base16_decode/1 + crop_string/2, base16_decode/1, string_replace/3 ]). %% Taken from OTP's uri_string module @@ -527,3 +527,6 @@ base16_decode(String) -> catch _:_ -> {error, nil} end. + +string_replace(String, Pattern, Replacement) -> + string:replace(String, Pattern, Replacement, all). diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs index 22ca8c3..821782d 100644 --- a/src/gleam_stdlib.mjs +++ b/src/gleam_stdlib.mjs @@ -192,10 +192,6 @@ export function add(a, b) { return a + b; } -export function equal(a, b) { - return a === b; -} - export function split(xs, pattern) { return List.fromArray(xs.split(pattern)); } @@ -674,7 +670,7 @@ export function decode_field(value, name) { const entry = map_get(value, name); return new Ok(entry.isOk() ? new Some(entry[0]) : new None()); } else if (value === null) { - return not_a_map_error() + return not_a_map_error(); } else if (Object.getPrototypeOf(value) == Object.prototype) { return try_get_field(value, name, () => new Ok(new None())); } else { |