From 38bcf27d66a589f0e761f0915395fc380c0e3bfe Mon Sep 17 00:00:00 2001 From: Gustaf Andersson Date: Mon, 21 Nov 2016 16:44:55 +0100 Subject: [PATCH] optimized reduce for range --- lib/elixir/lib/enum.ex | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/elixir/lib/enum.ex b/lib/elixir/lib/enum.ex index 28c94e06a18..b4807446f2d 100644 --- a/lib/elixir/lib/enum.ex +++ b/lib/elixir/lib/enum.ex @@ -1756,7 +1756,11 @@ defmodule Enum do end def reduce(first..last, acc, fun) when is_function(fun, 2) do - reduce_range(first, last, acc, fun, last >= first) + if first <= last do + reduce_range_inc(first, last, acc, fun) + else + reduce_range_dec(first, last, acc, fun) + end end def reduce(%{__struct__: _} = enumerable, acc, fun) when is_function(fun, 2) do @@ -1773,16 +1777,20 @@ defmodule Enum do fn x, acc -> {:cont, fun.(x, acc)} end) |> elem(1) end - defp reduce_range(x, y, acc, fun, true) when x <= y do - reduce_range(x + 1, y, fun.(x, acc), fun, true) + defp reduce_range_inc(first, first, acc, fun) do + fun.(first, acc) end - defp reduce_range(x, y, acc, fun, false) when x >= y do - reduce_range(x - 1, y, fun.(x, acc), fun, false) + defp reduce_range_inc(first, last, acc, fun) do + reduce_range_inc(first + 1, last, fun.(first, acc), fun) end - defp reduce_range(_, _, acc, _, _) do - acc + defp reduce_range_dec(first, first, acc, fun) do + fun.(first, acc) + end + + defp reduce_range_dec(first, last, acc, fun) do + reduce_range_dec(first - 1, last, fun.(first, acc), fun) end @doc """