Skip to content

Commit e62ea5a

Browse files
committed
Add AsyncSeq.interleaveMany and tests
1 parent 4210e65 commit e62ea5a

3 files changed

Lines changed: 29 additions & 1 deletion

File tree

src/FSharp.Control.AsyncSeq/AsyncSeq.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff 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"

src/FSharp.Control.AsyncSeq/AsyncSeq.fsi

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff 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>>

tests/FSharp.Control.AsyncSeq.Tests/AsyncSeqTests.fs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff 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>]
412431
let ``AsyncSeq.bufferByCount``() =

0 commit comments

Comments
 (0)