lib/akin/strategy.ex

defmodule Akin.Strategy do
  @moduledoc """
  Determine whether all comparison functions should use the simple ratio function or
  the substring ratio function.
  """
  @substring_similarity_threshold 1.5
  @substring_default_scale 0.9
  @one_string_much_longer_threshold 8
  @one_string_much_longer_scale 0.6

  def determine(left, right) do
    left_length = String.length(left)
    right_length = String.length(right)
    determine(left, right, left_length, right_length)
  end

  def determine(_left, _right, left_length, right_length)
      when left_length > 0 and right_length > 0 do
    length_ratio = Enum.max([left_length, right_length]) / Enum.min([left_length, right_length])

    cond do
      length_ratio < @substring_similarity_threshold ->
        :standard

      @one_string_much_longer_threshold < length_ratio ->
        {:substring, @one_string_much_longer_scale}

      true ->
        {:substring, @substring_default_scale}
    end
  end

  def determine(_, _, _, _), do: {:error, nil}
end