aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2024-03-05 22:09:22 +0000
committerLouis Pilfold <louis@lpil.uk>2024-03-05 22:09:22 +0000
commitb6894463caede28c8bce527c343895e28026f894 (patch)
tree9221ac307226a49fa7b892db947e8d1727bfb5aa /src
parent15af4b029e9240396c15e276c6bc53f31b1a576b (diff)
downloadgleam_stdlib-b6894463caede28c8bce527c343895e28026f894.tar.gz
gleam_stdlib-b6894463caede28c8bce527c343895e28026f894.zip
Remove some indirection
Diffstat (limited to 'src')
-rw-r--r--src/gleam/list.gleam49
-rw-r--r--src/gleam/string_builder.gleam43
-rw-r--r--src/gleam_stdlib.erl5
-rw-r--r--src/gleam_stdlib.mjs6
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 {