Obligatory benchmarks.
Name ips average deviation median 99th %
recursion 3.98 M 251.49 ns ±11214.50% 188 ns 456 ns
foldr 2.99 M 334.99 ns ±12387.85% 223 ns 506 ns
reduce 2.70 M 370.10 ns ±9843.80% 258 ns 567 ns
chunk_while 1.40 M 712.55 ns ±4515.89% 532 ns 968 ns
chunk_by_reject 0.86 M 1164.60 ns ±2888.22% 896 ns 1427 ns
Comparison:
recursion 3.98 M
foldr 2.99 M - 1.33x slower +83.50 ns
reduce 2.70 M - 1.47x slower +118.61 ns
chunk_while 1.40 M - 2.83x slower +461.06 ns
chunk_by_reject 0.86 M - 4.63x slower +913.11 ns
Operating System: macOS
CPU Information: Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
Number of Available Cores: 4
Available memory: 24 GB
Elixir 1.14.0
Erlang 25.0
Out of curiosity, I included this reduce version too:
Enum.reduce(list, {_group = [], _acc = []}, fn
0, {[], acc} -> {[], acc}
0, {group, acc} -> {[], [Enum.reverse(group) | acc]}
el, {group, acc} -> {[el | group], acc}
end)
|> case do
{[], acc} -> Enum.reverse(acc)
{group, acc} -> Enum.reverse([Enum.reverse(group) | acc])
end


















