-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 ).