Current section
Files
Jump to
Current section
Files
src/glevenshtein.erl
-module(glevenshtein).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([calculate/2]).
-spec filter_requirement(boolean(), fun(() -> integer()), fun(() -> integer())) -> integer().
filter_requirement(Condition, Return, Apply) ->
case Condition of
true ->
Return();
false ->
Apply()
end.
-spec get_operation_results(list(binary()), list(binary()), integer()) -> list(integer()).
get_operation_results(Word1, Word2, Distance) ->
[calculate_levenshtein_distance(gleam@list:drop(Word1, 1), Word2, Distance),
calculate_levenshtein_distance(
Word1,
gleam@list:drop(Word2, 1),
Distance
),
calculate_levenshtein_distance(
gleam@list:drop(Word1, 1),
gleam@list:drop(Word2, 1),
Distance
)].
-spec calculate_levenshtein_distance(list(binary()), list(binary()), integer()) -> integer().
calculate_levenshtein_distance(Word1, Word2, Distance) ->
filter_requirement(
gleam@list:is_empty(Word1),
fun() -> erlang:length(Word2) end,
fun() ->
filter_requirement(
gleam@list:is_empty(Word2),
fun() -> erlang:length(Word1) end,
fun() ->
filter_requirement(
begin
_pipe = gleam@list:first(Word1),
gleam@result:unwrap(_pipe, <<""/utf8>>)
end
=:= begin
_pipe@1 = gleam@list:first(Word2),
gleam@result:unwrap(_pipe@1, <<""/utf8>>)
end,
fun() ->
calculate_levenshtein_distance(
gleam@list:drop(Word1, 1),
gleam@list:drop(Word2, 1),
Distance
)
end,
fun() ->
_pipe@2 = get_operation_results(
Word1,
Word2,
Distance
),
_pipe@3 = gleam@list:reduce(
_pipe@2,
fun gleam@int:min/2
),
_pipe@4 = gleam@result:unwrap(_pipe@3, Distance),
gleam@int:add(_pipe@4, 1)
end
)
end
)
end
).
-spec calculate(binary(), binary()) -> integer().
calculate(Word1, Word2) ->
Word1@1 = begin
_pipe = Word1,
gleam@string:lowercase(_pipe)
end,
Word2@1 = begin
_pipe@1 = Word2,
gleam@string:lowercase(_pipe@1)
end,
calculate_levenshtein_distance(
begin
_pipe@2 = Word1@1,
gleam@string:to_graphemes(_pipe@2)
end,
begin
_pipe@3 = Word2@1,
gleam@string:to_graphemes(_pipe@3)
end,
0
).