@@ -789,16 +789,18 @@ defmodule Stream do
789
789
do_after ( after_fun , user_acc )
790
790
:erlang . raise ( kind , reason , stacktrace )
791
791
else
792
- { :suspended , [ val ] , next } ->
793
- do_transform_user ( val , user_acc , user , fun , :cont , next , inner_acc , inner , after_fun )
794
- { _ , [ val ] } ->
795
- do_transform_user ( val , user_acc , user , fun , :halt , next , inner_acc , inner , after_fun )
796
- { _ , [ ] } ->
797
- do_transform ( user_acc , user , fun , :halt , next , inner_acc , inner , after_fun )
792
+ { :suspended , vals , next } ->
793
+ do_transform_user ( :lists . reverse ( vals ) , user_acc , user , fun , :cont , next , inner_acc , inner , after_fun )
794
+ { _ , vals } ->
795
+ do_transform_user ( :lists . reverse ( vals ) , user_acc , user , fun , :halt , next , inner_acc , inner , after_fun )
798
796
end
799
797
end
800
798
801
- defp do_transform_user ( val , user_acc , user , fun , next_op , next , inner_acc , inner , after_fun ) do
799
+ defp do_transform_user ( [ ] , user_acc , user , fun , next_op , next , inner_acc , inner , after_fun ) do
800
+ do_transform ( user_acc , user , fun , next_op , next , inner_acc , inner , after_fun )
801
+ end
802
+
803
+ defp do_transform_user ( [ val | vals ] , user_acc , user , fun , next_op , next , inner_acc , inner , after_fun ) do
802
804
user . ( val , user_acc )
803
805
catch
804
806
kind , reason ->
@@ -808,20 +810,20 @@ defmodule Stream do
808
810
:erlang . raise ( kind , reason , stacktrace )
809
811
else
810
812
{ [ ] , user_acc } ->
811
- do_transform ( user_acc , user , fun , next_op , next , inner_acc , inner , after_fun )
813
+ do_transform_user ( vals , user_acc , user , fun , next_op , next , inner_acc , inner , after_fun )
812
814
{ list , user_acc } when is_list ( list ) ->
813
- do_list_transform ( user_acc , user , fun , next_op , next , inner_acc , inner ,
815
+ do_list_transform ( vals , user_acc , user , fun , next_op , next , inner_acc , inner ,
814
816
& Enumerable.List . reduce ( list , & 1 , fun ) , after_fun )
815
817
{ :halt , user_acc } ->
816
818
next . ( { :halt , [ ] } )
817
819
do_after ( after_fun , user_acc )
818
820
{ :halted , elem ( inner_acc , 1 ) }
819
821
{ other , user_acc } ->
820
- do_enum_transform ( user_acc , user , fun , next_op , next , inner_acc , inner ,
822
+ do_enum_transform ( vals , user_acc , user , fun , next_op , next , inner_acc , inner ,
821
823
& Enumerable . reduce ( other , & 1 , inner ) , after_fun )
822
824
end
823
825
824
- defp do_list_transform ( user_acc , user , fun , next_op , next , inner_acc , inner , reduce , after_fun ) do
826
+ defp do_list_transform ( vals , user_acc , user , fun , next_op , next , inner_acc , inner , reduce , after_fun ) do
825
827
try do
826
828
reduce . ( inner_acc )
827
829
catch
@@ -832,17 +834,17 @@ defmodule Stream do
832
834
:erlang . raise ( kind , reason , stacktrace )
833
835
else
834
836
{ :done , acc } ->
835
- do_transform ( user_acc , user , fun , next_op , next , { :cont , acc } , inner , after_fun )
837
+ do_transform_user ( vals , user_acc , user , fun , next_op , next , { :cont , acc } , inner , after_fun )
836
838
{ :halted , acc } ->
837
839
next . ( { :halt , [ ] } )
838
840
do_after ( after_fun , user_acc )
839
841
{ :halted , acc }
840
842
{ :suspended , acc , c } ->
841
- { :suspended , acc , & do_list_transform ( user_acc , user , fun , next_op , next , & 1 , inner , c , after_fun ) }
843
+ { :suspended , acc , & do_list_transform ( vals , user_acc , user , fun , next_op , next , & 1 , inner , c , after_fun ) }
842
844
end
843
845
end
844
846
845
- defp do_enum_transform ( user_acc , user , fun , next_op , next , { op , inner_acc } , inner , reduce , after_fun ) do
847
+ defp do_enum_transform ( vals , user_acc , user , fun , next_op , next , { op , inner_acc } , inner , reduce , after_fun ) do
846
848
try do
847
849
reduce . ( { op , [ :outer | inner_acc ] } )
848
850
catch
@@ -855,15 +857,15 @@ defmodule Stream do
855
857
# Only take into account outer halts when the op is not halt itself.
856
858
# Otherwise, we were the ones wishing to halt, so we should just stop.
857
859
{ :halted , [ :outer | acc ] } when op != :halt ->
858
- do_transform ( user_acc , user , fun , next_op , next , { :cont , acc } , inner , after_fun )
860
+ do_transform_user ( vals , user_acc , user , fun , next_op , next , { :cont , acc } , inner , after_fun )
859
861
{ :halted , [ _ | acc ] } ->
860
862
next . ( { :halt , [ ] } )
861
863
do_after ( after_fun , user_acc )
862
864
{ :halted , acc }
863
865
{ :done , [ _ | acc ] } ->
864
- do_transform ( user_acc , user , fun , next_op , next , { :cont , acc } , inner , after_fun )
866
+ do_transform_user ( vals , user_acc , user , fun , next_op , next , { :cont , acc } , inner , after_fun )
865
867
{ :suspended , [ _ | acc ] , c } ->
866
- { :suspended , acc , & do_enum_transform ( user_acc , user , fun , next_op , next , & 1 , inner , c , after_fun ) }
868
+ { :suspended , acc , & do_enum_transform ( vals , user_acc , user , fun , next_op , next , & 1 , inner , c , after_fun ) }
867
869
end
868
870
end
869
871
0 commit comments