Skip to content

Commit a7c008f

Browse files
committed
Simplify transform as suspend is guaranteed to return one entry
1 parent ff90cd1 commit a7c008f

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

lib/elixir/lib/stream.ex

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -963,13 +963,17 @@ defmodule Stream do
963963
after_fun.(user_acc)
964964
:erlang.raise(kind, reason, __STACKTRACE__)
965965
else
966-
{:suspended, vals, next} ->
967-
do_transform_user(:lists.reverse(vals), user_acc, :cont, next, inner_acc, funs)
966+
{:suspended, [val], next} ->
967+
do_transform_user(val, user_acc, :cont, next, inner_acc, funs)
968968

969-
{_, vals} ->
969+
{_, result} ->
970970
# Do not attempt to call the resource again, it has either done or halted
971971
next = fn _ -> {:done, []} end
972-
do_transform_user(:lists.reverse(vals), user_acc, :last, next, inner_acc, funs)
972+
973+
case result do
974+
[val] -> do_transform_user(val, user_acc, :last, next, inner_acc, funs)
975+
[] -> do_transform(user_acc, :last, next, inner_acc, funs)
976+
end
973977
end
974978
end
975979

@@ -984,7 +988,7 @@ defmodule Stream do
984988
after_fun.(user_acc)
985989
:erlang.raise(kind, reason, __STACKTRACE__)
986990
else
987-
result -> do_transform_result(result, [], :halt, next, inner_acc, funs)
991+
result -> do_transform_result(result, :halt, next, inner_acc, funs)
988992
end
989993
else
990994
do_transform(user_acc, :halt, next, inner_acc, funs)
@@ -997,11 +1001,7 @@ defmodule Stream do
9971001
{:halted, elem(inner_acc, 1)}
9981002
end
9991003

1000-
defp do_transform_user([], user_acc, next_op, next, inner_acc, funs) do
1001-
do_transform(user_acc, next_op, next, inner_acc, funs)
1002-
end
1003-
1004-
defp do_transform_user([val | vals], user_acc, next_op, next, inner_acc, funs) do
1004+
defp do_transform_user(val, user_acc, next_op, next, inner_acc, funs) do
10051005
{user, _, _, _, after_fun} = funs
10061006

10071007
try do
@@ -1012,20 +1012,20 @@ defmodule Stream do
10121012
after_fun.(user_acc)
10131013
:erlang.raise(kind, reason, __STACKTRACE__)
10141014
else
1015-
result -> do_transform_result(result, vals, next_op, next, inner_acc, funs)
1015+
result -> do_transform_result(result, next_op, next, inner_acc, funs)
10161016
end
10171017
end
10181018

1019-
defp do_transform_result(result, vals, next_op, next, inner_acc, funs) do
1019+
defp do_transform_result(result, next_op, next, inner_acc, funs) do
10201020
{_, fun, inner, _, after_fun} = funs
10211021

10221022
case result do
10231023
{[], user_acc} ->
1024-
do_transform_user(vals, user_acc, next_op, next, inner_acc, funs)
1024+
do_transform(user_acc, next_op, next, inner_acc, funs)
10251025

10261026
{list, user_acc} when is_list(list) ->
10271027
reduce = &Enumerable.List.reduce(list, &1, fun)
1028-
do_transform_inner_list(vals, user_acc, next_op, next, inner_acc, reduce, funs)
1028+
do_transform_inner_list(user_acc, next_op, next, inner_acc, reduce, funs)
10291029

10301030
{:halt, user_acc} ->
10311031
next.({:halt, []})
@@ -1034,11 +1034,11 @@ defmodule Stream do
10341034

10351035
{other, user_acc} ->
10361036
reduce = &Enumerable.reduce(other, &1, inner)
1037-
do_transform_inner_enum(vals, user_acc, next_op, next, inner_acc, reduce, funs)
1037+
do_transform_inner_enum(user_acc, next_op, next, inner_acc, reduce, funs)
10381038
end
10391039
end
10401040

1041-
defp do_transform_inner_list(vals, user_acc, next_op, next, inner_acc, reduce, funs) do
1041+
defp do_transform_inner_list(user_acc, next_op, next, inner_acc, reduce, funs) do
10421042
{_, _, _, _, after_fun} = funs
10431043

10441044
try do
@@ -1050,20 +1050,20 @@ defmodule Stream do
10501050
:erlang.raise(kind, reason, __STACKTRACE__)
10511051
else
10521052
{:done, acc} ->
1053-
do_transform_user(vals, user_acc, next_op, next, {:cont, acc}, funs)
1053+
do_transform(user_acc, next_op, next, {:cont, acc}, funs)
10541054

10551055
{:halted, acc} ->
10561056
next.({:halt, []})
10571057
after_fun.(user_acc)
10581058
{:halted, acc}
10591059

10601060
{:suspended, acc, continuation} ->
1061-
resume = &do_transform_inner_list(vals, user_acc, next_op, next, &1, continuation, funs)
1061+
resume = &do_transform_inner_list(user_acc, next_op, next, &1, continuation, funs)
10621062
{:suspended, acc, resume}
10631063
end
10641064
end
10651065

1066-
defp do_transform_inner_enum(vals, user_acc, next_op, next, {op, inner_acc}, reduce, funs) do
1066+
defp do_transform_inner_enum(user_acc, next_op, next, {op, inner_acc}, reduce, funs) do
10671067
{_, _, _, _, after_fun} = funs
10681068

10691069
try do
@@ -1077,18 +1077,18 @@ defmodule Stream do
10771077
# The user wanted to cont/suspend but the stream halted,
10781078
# so we continue with the user intention.
10791079
{:halted, [inner_op | acc]} when op != :halt and inner_op != :halt ->
1080-
do_transform_user(vals, user_acc, next_op, next, {inner_op, acc}, funs)
1080+
do_transform(user_acc, next_op, next, {inner_op, acc}, funs)
10811081

10821082
{:halted, [_ | acc]} ->
10831083
next.({:halt, []})
10841084
after_fun.(user_acc)
10851085
{:halted, acc}
10861086

10871087
{:done, [_ | acc]} ->
1088-
do_transform_user(vals, user_acc, next_op, next, {:cont, acc}, funs)
1088+
do_transform(user_acc, next_op, next, {:cont, acc}, funs)
10891089

10901090
{:suspended, [_ | acc], continuation} ->
1091-
resume = &do_transform_inner_enum(vals, user_acc, next_op, next, &1, continuation, funs)
1091+
resume = &do_transform_inner_enum(user_acc, next_op, next, &1, continuation, funs)
10921092
{:suspended, acc, resume}
10931093
end
10941094
end

0 commit comments

Comments
 (0)