Skip to content

Commit 9c20d3f

Browse files
authored
Merge pull request #176 from njlr/feature/interleave-many
feature/interleave-many
2 parents fb30916 + bab5370 commit 9c20d3f

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
@@ -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"

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
@@ -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>]
411430
let ``AsyncSeq.bufferByCount``() =

0 commit comments

Comments
 (0)