aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam_stdlib.erl72
-rw-r--r--test/gleam/string_test.gleam58
2 files changed, 59 insertions, 71 deletions
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index 959d14d..76b51f8 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -28,11 +28,11 @@
end).
-define(is_lowercase_char(X), (X > 96 andalso X < 123)).
-
-define(is_underscore_char(X), (X == 95)).
-
-define(is_digit_char(X), (X > 47 andalso X < 58)).
+uppercase(X) -> X - 32.
+
map_get(Map, Key) ->
case maps:find(Key, Map) of
error -> {error, nil};
@@ -371,11 +371,11 @@ inspect(false) ->
"False";
inspect(nil) ->
"Nil";
-inspect(Any) when is_atom(Any) ->
- AtomAsList = erlang:atom_to_list(Any),
- case inspect_maybe_gleam_atom(AtomAsList, none, []) of
- {ok, GleamCompatibleAtomString} -> erlang:list_to_binary(GleamCompatibleAtomString);
- {error, no_gleam_atom} -> ["//erl('", erlang:atom_to_binary(Any), "')"]
+inspect(Atom) when is_atom(Atom) ->
+ Binary = erlang:atom_to_binary(Atom),
+ case inspect_maybe_gleam_atom(Binary, none, <<>>) of
+ {ok, Inspected} -> Inspected;
+ {error, _} -> ["//erl('", Binary, "')"]
end;
inspect(Any) when is_integer(Any) ->
erlang:integer_to_list(Any);
@@ -417,36 +417,38 @@ inspect(Any) when is_function(Any) ->
inspect(Any) ->
["//erl(", io_lib:format("~p", [Any]), ")"].
-inspect_maybe_gleam_atom([], none, []) ->
- {error, no_gleam_atom};
-inspect_maybe_gleam_atom([Head | _Rest], none, []) when ?is_digit_char(Head) ->
- {error, no_gleam_atom};
-inspect_maybe_gleam_atom([$_ | _Rest], none, []) ->
- {error, no_gleam_atom};
-inspect_maybe_gleam_atom([$_ | []], _PrevChar, _Acc) ->
- {error, no_gleam_atom};
-inspect_maybe_gleam_atom([$_ | _Rest], $_, _Acc) ->
- {error, no_gleam_atom};
-inspect_maybe_gleam_atom([Head | _Rest], _PrevChar, _Acc)
- when not (?is_lowercase_char(Head) orelse ?is_underscore_char(Head) orelse ?is_digit_char(Head)) ->
- {error, no_gleam_atom};
-inspect_maybe_gleam_atom([Head | Rest], none, Acc) ->
- inspect_maybe_gleam_atom(Rest, Head, [string:uppercase([Head]) | Acc]);
-inspect_maybe_gleam_atom([$_ | Rest], _PrevChar, Acc) ->
+
+inspect_maybe_gleam_atom(<<>>, none, _) ->
+ {error, nil};
+inspect_maybe_gleam_atom(<<First, _Rest/binary>>, none, _) when ?is_digit_char(First) ->
+ {error, nil};
+inspect_maybe_gleam_atom(<<"_", _Rest/binary>>, none, _) ->
+ {error, nil};
+inspect_maybe_gleam_atom(<<"_">>, _PrevChar, _Acc) ->
+ {error, nil};
+inspect_maybe_gleam_atom(<<"_", _Rest/binary>>, $_, _Acc) ->
+ {error, nil};
+inspect_maybe_gleam_atom(<<First, _Rest/binary>>, _PrevChar, _Acc)
+ when not (?is_lowercase_char(First) orelse ?is_underscore_char(First) orelse ?is_digit_char(First)) ->
+ {error, nil};
+inspect_maybe_gleam_atom(<<First, Rest/binary>>, none, Acc) ->
+ inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, (uppercase(First))>>);
+inspect_maybe_gleam_atom(<<"_", Rest/binary>>, _PrevChar, Acc) ->
inspect_maybe_gleam_atom(Rest, $_, Acc);
-inspect_maybe_gleam_atom([Head | Rest], $_, Acc) ->
- inspect_maybe_gleam_atom(Rest, Head, [string:uppercase([Head]) | Acc]);
-inspect_maybe_gleam_atom([Head | Rest], PrevChar, Acc) when ?is_digit_char(PrevChar) ->
- inspect_maybe_gleam_atom(Rest, Head, [string:uppercase([Head]) | Acc]);
-inspect_maybe_gleam_atom([Head | Rest], _PrevChar, Acc) ->
- inspect_maybe_gleam_atom(Rest, Head, [Head | Acc]);
-inspect_maybe_gleam_atom([], _PrevChar, Acc) ->
- {ok, lists:reverse(Acc)}.
+inspect_maybe_gleam_atom(<<First, Rest/binary>>, $_, Acc) ->
+ inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, (uppercase(First))>>);
+inspect_maybe_gleam_atom(<<First, Rest/binary>>, _PrevChar, Acc) ->
+ inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, First>>);
+inspect_maybe_gleam_atom(<<>>, _PrevChar, Acc) ->
+ {ok, Acc};
+inspect_maybe_gleam_atom(A, B, C) ->
+ erlang:display({A, B, C}),
+ throw({gleam_error, A, B, C}).
inspect_list([]) ->
{proper, []};
-inspect_list([Head]) ->
- {proper, [inspect(Head)]};
+inspect_list([First]) ->
+ {proper, [inspect(First)]};
inspect_list([First | Rest]) when is_list(Rest) ->
{Kind, Inspected} = inspect_list(Rest),
{Kind, [inspect(First), <<", ">> | Inspected]};
@@ -456,8 +458,8 @@ inspect_list([First | ImproperTail]) ->
inspect_maybe_utf8_string(Binary, Acc) ->
case Binary of
<<>> -> {ok, <<$", Acc/binary, $">>};
- <<Head/utf8, Rest/binary>> ->
- Escaped = case Head of
+ <<First/utf8, Rest/binary>> ->
+ Escaped = case First of
$" -> <<$\\, $">>;
$\\ -> <<$\\, $\\>>;
$\r -> <<$\\, $r>>;
diff --git a/test/gleam/string_test.gleam b/test/gleam/string_test.gleam
index c072800..5b9b2a5 100644
--- a/test/gleam/string_test.gleam
+++ b/test/gleam/string_test.gleam
@@ -999,55 +999,45 @@ fn string_to_erlang_atom(a: String) -> Dynamic
@target(erlang)
pub fn inspect_erlang_atom_is_valid_in_gleam_test() {
- string_to_erlang_atom("a_common_erlang_atom_is_valid_in_gleam")
+ string_to_erlang_atom("one_two")
|> string.inspect
- |> should.equal("ACommonErlangAtomIsValidInGleam")
+ |> should.equal("OneTwo")
- string_to_erlang_atom(
- "an_erlang_atom_with_1_or_many_non_leading_digits_is_valid_in_gleam",
- )
+ string_to_erlang_atom("one1_two")
+ |> string.inspect
+ |> should.equal("One1Two")
+
+ string_to_erlang_atom("one1two")
|> string.inspect
- |> should.equal("AnErlangAtomWith1OrManyNonLeadingDigitsIsValidInGleam")
+ |> should.equal("One1two")
}
@target(erlang)
pub fn inspect_erlang_atom_with_a_leading_underscore_is_invalid_in_gleam_test() {
- string_to_erlang_atom(
- "_an_erlang_atom_with_a_leading_underscore_is_invalid_in_gleam",
- )
+ string_to_erlang_atom("_ok")
|> string.inspect
- |> should.equal(
- "//erl('_an_erlang_atom_with_a_leading_underscore_is_invalid_in_gleam')",
- )
+ |> should.equal("//erl('_ok')")
}
@target(erlang)
pub fn inspect_erlang_atom_with_a_trailing_underscore_is_invalid_in_gleam_test() {
- string_to_erlang_atom(
- "an_erlang_atom_with_a_trailing_underscore_is_invalid_in_gleam_",
- )
+ string_to_erlang_atom("ok_")
|> string.inspect
- |> should.equal(
- "//erl('an_erlang_atom_with_a_trailing_underscore_is_invalid_in_gleam_')",
- )
+ |> should.equal("//erl('ok_')")
}
@target(erlang)
pub fn inspect_erlang_atom_with_a_double_underscore_is_invalid_in_gleam_test() {
- string_to_erlang_atom("an_erlang_atom_with_a_double__underscore_is_invalid")
+ string_to_erlang_atom("ok__ok")
|> string.inspect
- |> should.equal(
- "//erl('an_erlang_atom_with_a_double__underscore_is_invalid')",
- )
+ |> should.equal("//erl('ok__ok')")
}
@target(erlang)
pub fn inspect_erlang_atom_with_white_spaces_is_invalid_in_gleam_test() {
- string_to_erlang_atom("an erlang atom with white spaces is invalid in gleam")
+ string_to_erlang_atom("ok ok")
|> string.inspect
- |> should.equal(
- "//erl('an erlang atom with white spaces is invalid in gleam')",
- )
+ |> should.equal("//erl('ok ok')")
}
@target(erlang)
@@ -1060,24 +1050,20 @@ pub fn inspect_erlang_atom_that_is_an_empty_string_is_invalid_in_gleam_test() {
@target(erlang)
pub fn inspect_erlang_atom_with_uppercases_invalid_in_gleam_test() {
- string_to_erlang_atom("AnErlangAtomWithUpperCasesIsInvalidInGleam")
+ string_to_erlang_atom("Upper")
|> string.inspect
- |> should.equal("//erl('AnErlangAtomWithUpperCasesIsInvalidInGleam')")
+ |> should.equal("//erl('Upper')")
}
@target(erlang)
pub fn inspect_erlang_atom_with_leading_digit_invalid_in_gleam_test() {
- string_to_erlang_atom(
- "1_erlang_atom_with_a_leading_digit_is_invalid_in_gleam",
- )
+ string_to_erlang_atom("1_ok")
|> string.inspect
- |> should.equal(
- "//erl('1_erlang_atom_with_a_leading_digit_is_invalid_in_gleam')",
- )
+ |> should.equal("//erl('1_ok')")
- string_to_erlang_atom("1ErlangAtomWithALeadingDigitIsInvalidInGleam")
+ string_to_erlang_atom("1Ok")
|> string.inspect
- |> should.equal("//erl('1ErlangAtomWithALeadingDigitIsInvalidInGleam')")
+ |> should.equal("//erl('1Ok')")
}
pub fn byte_size_test() {