Skip to content

Commit 673e9e9

Browse files
MainShayne233lpil
authored andcommitted
Implement parse_int
1 parent e6fc269 commit 673e9e9

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

gen/str.erl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
-compile(no_auto_import).
33
-include_lib("eunit/include/eunit.hrl").
44

5-
-export([length/1, lowercase/1, uppercase/1, reverse/1, split/2, replace/3, from_int/1, base_from_int/2, from_float/1]).
5+
-export([length/1, lowercase/1, uppercase/1, reverse/1, split/2, replace/3, from_int/1, parse_int/1, base_from_int/2, from_float/1]).
66

77
length(A) ->
88
string:length(A).
@@ -68,6 +68,19 @@ from_int_test() ->
6868
expect:equal(from_int(123), <<"123">>).
6969
-endif.
7070

71+
parse_int(A) ->
72+
gleam__stdlib:parse_int(A).
73+
74+
-ifdef(TEST).
75+
parse_int_test() ->
76+
expect:equal(parse_int(<<"123">>), {ok, 123}),
77+
expect:equal(parse_int(<<"-123">>), {ok, -123}),
78+
expect:equal(parse_int(<<"0123">>), {ok, 123}),
79+
expect:equal(parse_int(<<"">>), {error, parse_error}),
80+
expect:equal(parse_int(<<"what">>), {error, parse_error}),
81+
expect:equal(parse_int(<<"1.23">>), {error, parse_error}).
82+
-endif.
83+
7184
base_from_int(A, B) ->
7285
erlang:integer_to_binary(A, B).
7386

src/gleam__stdlib.erl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
atom_create_from_string/1, atom_to_string/1, map_fetch/2,
77
iodata_append/2, iodata_prepend/2, identity/1, decode_int/1,
88
decode_string/1, decode_bool/1, decode_float/1, decode_thunk/1,
9-
decode_tuple/1, decode_list/1, decode_field/2]).
9+
decode_tuple/1, decode_list/1, decode_field/2, parse_int/1]).
1010

1111
expect_equal(Actual, Expected) -> ?assertEqual(Expected, Actual).
1212
expect_not_equal(Actual, Expected) -> ?assertNotEqual(Expected, Actual).
@@ -69,3 +69,12 @@ decode_field(Data, Key) ->
6969
_ ->
7070
decode_error_msg(io_lib:format("a map with key `~p`", [Key]), Data)
7171
end.
72+
73+
parse_int(String) ->
74+
case string:to_integer(binary:bin_to_list(String)) of
75+
{Integer, []} ->
76+
{ok, Integer};
77+
78+
_ ->
79+
{error, parse_error}
80+
end.

src/str.gleam

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import list
77

88
pub external fn length(String) -> Int = "string" "length"
99

10+
pub enum ParseError =
11+
| ParseError
12+
1013
test length {
1114
length("ß↑e̊")
1215
|> expect:equal(_, 3)
@@ -90,6 +93,34 @@ test from_int {
9093
|> expect:equal(_, "123")
9194
}
9295

96+
pub external fn parse_int(String) -> Result(Int, ParseError) = "gleam__stdlib" "parse_int";
97+
98+
test parse_int {
99+
"123"
100+
|> parse_int
101+
|> expect:equal(_, Ok(123))
102+
103+
"-123"
104+
|> parse_int
105+
|> expect:equal(_, Ok(-123))
106+
107+
"0123"
108+
|> parse_int
109+
|> expect:equal(_, Ok(123))
110+
111+
""
112+
|> parse_int
113+
|> expect:equal(_, Error(ParseError))
114+
115+
"what"
116+
|> parse_int
117+
|> expect:equal(_, Error(ParseError))
118+
119+
"1.23"
120+
|> parse_int
121+
|> expect:equal(_, Error(ParseError))
122+
}
123+
93124
pub external fn base_from_int(Int, Int) -> String = "erlang" "integer_to_binary"
94125

95126
test base_from_int {

0 commit comments

Comments
 (0)