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 @@ -1396,6 +1396,11 @@ module AsyncSeq =
13961396 let interleave ( source1 : AsyncSeq < 'T >) ( source2 : AsyncSeq < 'T >) : AsyncSeq < 'T > =
13971397 interleaveChoice source1 source2 |> map ( function Choice1Of2 x -> x | Choice2Of2 x -> x)
13981398
1399+ let interleaveMany ( xs : #seq<AsyncSeq<'T>> ) : AsyncSeq < 'T > =
1400+ let mutable result = empty
1401+ for x in xs do
1402+ result <- interleave result x
1403+ result
13991404
14001405 let bufferByCount ( bufferSize : int ) ( source : AsyncSeq < 'T >) : AsyncSeq < 'T []> =
14011406 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 @@ -407,6 +407,25 @@ let ``AsyncSeq.interleave first empty``() =
407407 let merged = AsyncSeq.interleave s1 s2 |> AsyncSeq.toListSynchronously
408408 Assert.True([ 1 ; 2 ; 3 ] = merged)
409409
410+ [<Test>]
411+ let ``AsyncSeq.interleaveMany empty`` () =
412+ let merged = AsyncSeq.interleaveMany [] |> AsyncSeq.toListSynchronously
413+ Assert.True( List.isEmpty merged)
414+
415+ [<Test>]
416+ let ``AsyncSeq.interleaveMany 1`` () =
417+ let s1 = AsyncSeq.ofSeq [ " a" ; " b" ; " c" ]
418+ let merged = AsyncSeq.interleaveMany [ s1] |> AsyncSeq.toListSynchronously
419+ Assert.True([ " a" ; " b" ; " c" ] = merged)
420+
421+ [<Test>]
422+ let ``AsyncSeq.interleaveMany 3`` () =
423+ let s1 = AsyncSeq.ofSeq [ " a" ; " b" ]
424+ let s2 = AsyncSeq.ofSeq [ " i" ; " j" ; " k" ; " l" ]
425+ let s3 = AsyncSeq.ofSeq [ " x" ; " y" ; " z" ]
426+ let merged = AsyncSeq.interleaveMany [ s1; s2; s3] |> AsyncSeq.toListSynchronously
427+ Assert.True([ " a" ; " x" ; " i" ; " y" ; " b" ; " z" ; " j" ; " k" ; " l" ] = merged)
428+
410429
411430[<Test>]
412431let ``AsyncSeq.bufferByCount`` () =
You can’t perform that action at this time.
0 commit comments