Skip to content

Commit

Permalink
Remove some indirection
Browse files Browse the repository at this point in the history
  • Loading branch information
lpil committed Mar 5, 2024
1 parent 15af4b0 commit b689446
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 82 deletions.
49 changes: 11 additions & 38 deletions src/gleam/list.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand Down Expand Up @@ -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])
}
}

Expand Down Expand Up @@ -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])
}
}

Expand Down
43 changes: 5 additions & 38 deletions src/gleam/string_builder.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
}
5 changes: 4 additions & 1 deletion src/gleam_stdlib.erl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -527,3 +527,6 @@ base16_decode(String) ->
catch
_:_ -> {error, nil}
end.

string_replace(String, Pattern, Replacement) ->
string:replace(String, Pattern, Replacement, all).
6 changes: 1 addition & 5 deletions src/gleam_stdlib.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit b689446

Please sign in to comment.