Чтобы выполнить задачу, как указано (разделить на первое вхождение), используйте кувалду, которая всегда работает: Enum.reduce_while/3
.
input = [1, 2, 3, 4]
input
|> Enum.with_index()
|> Enum.reduce_while({nil, []}, fn {e, idx}, {value, rest} ->
if e >= 3,
do: {:halt, {e, Enum.reverse(rest) ++ tl(Enum.slice(input, idx..-1))}},
else: {:cont, {value, [e | rest]}} end)
#⇒ {3, [1, 2, 4]}
Трюк with_index
нужен здесь только для производительности. Как только элемент найден, мы хотим немедленно остановить итерации, поэтому нам нужен индекс следующего элемента для массового добавления хвоста к результату.
Другой способ - использовать Enum.split_while/2
with {h, [e | t]} <- Enum.split_while(input, fn x -> not(x >= 3) end),
do: {e, h ++ t}
#⇒ {3, [1, 2, 4]}