File tree Expand file tree Collapse file tree
src/FSharp.Control.AsyncSeq
tests/FSharp.Control.AsyncSeq.Tests Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1384,6 +1384,11 @@ module AsyncSeq =
13841384 let interleave ( source1 : AsyncSeq < 'T >) ( source2 : AsyncSeq < 'T >) : AsyncSeq < 'T > =
13851385 interleaveChoice source1 source2 |> map ( function Choice1Of2 x -> x | Choice2Of2 x -> x)
13861386
1387+ let interleaveMany ( xs : #seq<AsyncSeq<'T>> ) : AsyncSeq < 'T > =
1388+ let mutable result = empty
1389+ for x in xs do
1390+ result <- interleave result x
1391+ result
13871392
13881393 let bufferByCount ( bufferSize : int ) ( source : AsyncSeq < 'T >) : AsyncSeq < 'T []> =
13891394 if ( bufferSize < 1 ) then invalidArg " bufferSize" " must be positive"
Original file line number Diff line number Diff line change @@ -462,11 +462,15 @@ module AsyncSeq =
462462 /// large or infinite sequences.
463463 val sortByDescending : projection :( 'T -> 'Key ) -> source : AsyncSeq < 'T > -> array < 'T > when 'Key : comparison
464464 #endif
465-
465+
466466 /// Interleaves two async sequences of the same type into a resulting sequence. The provided
467467 /// sequences are consumed in lock - step.
468468 val interleave : source1 : AsyncSeq < 'T > -> source2 : AsyncSeq < 'T > -> AsyncSeq < 'T >
469469
470+ /// Interleaves a sequence of async sequences into a resulting async sequence. The provided
471+ /// sequences are consumed in lock - step.
472+ val interleaveMany : source : #seq < AsyncSeq < 'T >> -> AsyncSeq < 'T >
473+
470474 /// Interleaves two async sequences into a resulting sequence. The provided
471475 /// sequences are consumed in lock - step.
472476 val interleaveChoice : source1 : AsyncSeq < 'T1 > -> source2 : AsyncSeq < 'T2 > -> AsyncSeq < Choice < 'T1 , 'T2 >>
Original file line number Diff line number Diff line change @@ -406,6 +406,25 @@ let ``AsyncSeq.interleave first empty``() =
406406 let merged = AsyncSeq.interleave s1 s2 |> AsyncSeq.toListSynchronously
407407 Assert.True([ 1 ; 2 ; 3 ] = merged)
408408
409+ [<Test>]
410+ let ``AsyncSeq.interleaveMany empty`` () =
411+ let merged = AsyncSeq.interleaveMany [] |> AsyncSeq.toListSynchronously
412+ Assert.True( List.isEmpty merged)
413+
414+ [<Test>]
415+ let ``AsyncSeq.interleaveMany 1`` () =
416+ let s1 = AsyncSeq.ofSeq [ " a" ; " b" ; " c" ]
417+ let merged = AsyncSeq.interleaveMany [ s1] |> AsyncSeq.toListSynchronously
418+ Assert.True([ " a" ; " b" ; " c" ] = merged)
419+
420+ [<Test>]
421+ let ``AsyncSeq.interleaveMany 3`` () =
422+ let s1 = AsyncSeq.ofSeq [ " a" ; " b" ]
423+ let s2 = AsyncSeq.ofSeq [ " i" ; " j" ; " k" ; " l" ]
424+ let s3 = AsyncSeq.ofSeq [ " x" ; " y" ; " z" ]
425+ let merged = AsyncSeq.interleaveMany [ s1; s2; s3] |> AsyncSeq.toListSynchronously
426+ Assert.True([ " a" ; " x" ; " i" ; " y" ; " b" ; " z" ; " j" ; " k" ; " l" ] = merged)
427+
409428
410429[<Test>]
411430let ``AsyncSeq.bufferByCount`` () =
You can’t perform that action at this time.
0 commit comments