@@ -416,6 +416,22 @@ defmodule StreamTest do
416416 assert Stream . transform ( nats , 0 , & { [ & 1 , & 2 ] , & 1 + & 2 } ) |> Enum . take ( 6 ) == [ 1 , 0 , 2 , 1 , 3 , 3 ]
417417 end
418418
419+ test "transform/3 with early halt" do
420+ stream = Stream . repeatedly ( fn -> throw ( :error ) end )
421+ |> Stream . transform ( nil , & { [ & 1 , & 2 ] , & 1 } )
422+
423+ assert { :halted , nil } =
424+ Enumerable . reduce ( stream , { :halt , nil } , fn _ , _ -> throw ( :error ) end )
425+ end
426+
427+ test "transform/3 with early suspend" do
428+ stream = Stream . repeatedly ( fn -> throw ( :error ) end )
429+ |> Stream . transform ( nil , & { [ & 1 , & 2 ] , & 1 } )
430+
431+ assert { :suspended , nil , _ } =
432+ Enumerable . reduce ( stream , { :suspend , nil } , fn _ , _ -> throw ( :error ) end )
433+ end
434+
419435 test "transform/3 with halt" do
420436 stream = Stream . resource ( fn -> 1 end ,
421437 fn acc -> { [ acc ] , acc + 1 } end ,
@@ -570,6 +586,27 @@ defmodule StreamTest do
570586 assert Process . get ( :stream_transform )
571587 end
572588
589+ test "transform/4 with early halt" do
590+ stream = Stream . repeatedly ( fn -> throw ( :error ) end )
591+ |> Stream . transform ( fn -> nil end , & { [ & 1 , & 2 ] , & 1 } ,
592+ fn nil -> Process . put ( :stream_transform , true ) end )
593+
594+ Process . put ( :stream_transform , false )
595+ assert { :halted , nil } =
596+ Enumerable . reduce ( stream , { :halt , nil } , fn _ , _ -> throw ( :error ) end )
597+ assert Process . get ( :stream_transform )
598+ end
599+
600+ test "transform/4 with early suspend" do
601+ stream = Stream . repeatedly ( fn -> throw ( :error ) end )
602+ |> Stream . transform ( fn -> nil end , & { [ & 1 , & 2 ] , & 1 } ,
603+ fn nil -> Process . put ( :stream_transform , true ) end )
604+
605+ refute Process . get ( :stream_transform )
606+ assert { :suspended , nil , _ } =
607+ Enumerable . reduce ( stream , { :suspend , nil } , fn _ , _ -> throw ( :error ) end )
608+ end
609+
573610 test "transform/4 closes on outer errors" do
574611 stream = Stream . transform ( 1 .. 10 , fn -> 0 end ,
575612 fn 3 , _ -> throw ( :error )
0 commit comments