@@ -2449,43 +2449,47 @@ module AsyncSeq =
24492449
24502450 let traverseOptionAsync ( f : 'T -> Async < 'U option >) ( source : AsyncSeq < 'T >) : Async < AsyncSeq < 'U > option > = async {
24512451 use ie = source.GetEnumerator()
2452- let! move = ie.MoveNext()
2453- let b = ref move
2452+ let! first = ie.MoveNext()
2453+ let mutable current = first
2454+ let mutable failed = false
24542455 let buffer = ResizeArray<_>()
2455- let fail = ref false
2456- while b.Value.IsSome && not fail.Value do
2457- let! vOpt = f b.Value.Value
2458- match vOpt with
2459- | Some v -> buffer.Add v
2460- | None -> b := None ; fail := true
2461- let! moven = ie.MoveNext()
2462- b := moven
2463- if fail.Value then
2464- return None
2456+ while current.IsSome && not failed do
2457+ let! vOpt = f current.Value
2458+ match vOpt with
2459+ | Some v ->
2460+ buffer.Add v
2461+ let! next = ie.MoveNext()
2462+ current <- next
2463+ | None ->
2464+ failed <- true
2465+ if failed then
2466+ return None
24652467 else
2466- let res = buffer.ToArray()
2467- return Some ( asyncSeq { for v in res do yield v })
2468- }
2468+ let res = buffer.ToArray()
2469+ return Some ( asyncSeq { for v in res do yield v })
2470+ }
24692471
24702472 let traverseChoiceAsync ( f : 'T -> Async < Choice < 'U , 'e >>) ( source : AsyncSeq < 'T >) : Async < Choice < AsyncSeq < 'U >, 'e >> = async {
24712473 use ie = source.GetEnumerator()
2472- let! move = ie.MoveNext()
2473- let b = ref move
2474+ let! first = ie.MoveNext()
2475+ let mutable current = first
2476+ let mutable failWith = ValueNone
24742477 let buffer = ResizeArray<_>()
2475- let fail = ref None
2476- while b.Value.IsSome && fail.Value.IsNone do
2477- let! vOpt = f b.Value.Value
2478- match vOpt with
2479- | Choice1Of2 v -> buffer.Add v
2480- | Choice2Of2 err -> b := None ; fail := Some err
2481- let! moven = ie.MoveNext()
2482- b := moven
2483- match fail.Value with
2484- | Some err -> return Choice2Of2 err
2485- | None ->
2486- let res = buffer.ToArray()
2487- return Choice1Of2 ( asyncSeq { for v in res do yield v })
2488- }
2478+ while current.IsSome && failWith.IsNone do
2479+ let! vOpt = f current.Value
2480+ match vOpt with
2481+ | Choice1Of2 v ->
2482+ buffer.Add v
2483+ let! next = ie.MoveNext()
2484+ current <- next
2485+ | Choice2Of2 err ->
2486+ failWith <- ValueSome err
2487+ match failWith with
2488+ | ValueSome err -> return Choice2Of2 err
2489+ | ValueNone ->
2490+ let res = buffer.ToArray()
2491+ return Choice1Of2 ( asyncSeq { for v in res do yield v })
2492+ }
24892493
24902494 #if ( NETSTANDARD || NET)
24912495 #if ! FABLE_ COMPILER
0 commit comments