defmodule Plausible.Stats.Compare do def calculate_change(:conversion_rate, old_value, new_value) do Float.round(new_value - old_value, 1) end def calculate_change(:exit_rate, old_value, new_value) do if is_float(old_value) and is_float(new_value) do Float.round(new_value - old_value, 1) end end def calculate_change(:bounce_rate, old_count, new_count) do if old_count > 0, do: new_count - old_count end def calculate_change(_metric, old_count, new_count) do percent_change(old_count, new_count) end def percent_change(nil, _new_count), do: nil def percent_change(_old_count, nil), do: nil def percent_change(%{value: old_count}, %{value: new_count}) do percent_change(old_count, new_count) end def percent_change(old_count, new_count) do cond do old_count == 0 and new_count > 0 -> 100 old_count == 0 and new_count == 0 -> 0 true -> round((new_count - old_count) / old_count * 100) end end end