Skip to content

Commit e1a5d78

Browse files
committed
Merge pull request #13 from fsprojects/fix-6
For is too eager
2 parents 63b6f8a + 05af635 commit e1a5d78

2 files changed

Lines changed: 14 additions & 4 deletions

File tree

src/FSharp.Control.AsyncSeq/AsyncSeq.fs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,11 @@ module AsyncSeq =
207207
if box resource <> null then resource.Dispose())
208208

209209
member x.For(seq:seq<'T>, action:'T -> AsyncSeq<'TResult>) =
210-
let enum = seq.GetEnumerator()
211-
x.TryFinally(x.While((fun () -> enum.MoveNext()), x.Delay(fun () ->
212-
action enum.Current)), (fun () ->
213-
if enum <> null then enum.Dispose() ))
210+
x.Delay(fun () ->
211+
let enum = seq.GetEnumerator()
212+
x.TryFinally(x.While((fun () -> enum.MoveNext()), x.Delay(fun () ->
213+
action enum.Current)), (fun () ->
214+
if enum <> null then enum.Dispose() )))
214215

215216
member x.For (seq:AsyncSeq<'T>, action:'T -> AsyncSeq<'TResult>) =
216217
collect action seq

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,3 +432,12 @@ let ``AsyncSeq.getIterator should work``() =
432432
| Some _ -> Assert.Fail("expected None")
433433

434434

435+
436+
[<Test>]
437+
let ``asyncSeq.For should delay``() =
438+
let (s:seq<int>) =
439+
{ new System.Collections.Generic.IEnumerable<int> with
440+
member x.GetEnumerator() = failwith "fail"
441+
interface System.Collections.IEnumerable with
442+
member x.GetEnumerator() = failwith "fail" }
443+
Assert.DoesNotThrow(fun _ -> asyncSeq.For(s, (fun v -> AsyncSeq.empty)) |> ignore)

0 commit comments

Comments
 (0)