Skip to content

Commit 06c8a87

Browse files
authored
Merge branch 'main' into daily-perf-improver/optimize-collect-operation
2 parents c1ce964 + f42f94b commit 06c8a87

1 file changed

Lines changed: 22 additions & 4 deletions

File tree

src/FSharp.Control.AsyncSeq/AsyncSeq.fs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -808,14 +808,32 @@ module AsyncSeq =
808808
// --------------------------------------------------------------------------
809809
// Additional combinators (implemented as async/asyncSeq computations)
810810

811+
// Optimized mapAsync enumerator that avoids computation builder overhead
812+
type private OptimizedMapAsyncEnumerator<'T, 'TResult>(source: IAsyncEnumerator<'T>, f: 'T -> Async<'TResult>) =
813+
let mutable disposed = false
814+
815+
interface IAsyncEnumerator<'TResult> with
816+
member _.MoveNext() = async {
817+
let! moveResult = source.MoveNext()
818+
match moveResult with
819+
| None -> return None
820+
| Some value ->
821+
let! mapped = f value
822+
return Some mapped
823+
}
824+
825+
member _.Dispose() =
826+
if not disposed then
827+
disposed <- true
828+
source.Dispose()
829+
811830
let mapAsync f (source : AsyncSeq<'T>) : AsyncSeq<'TResult> =
812831
match source with
813832
| :? AsyncSeqOp<'T> as source -> source.MapAsync f
814833
| _ ->
815-
asyncSeq {
816-
for itm in source do
817-
let! v = f itm
818-
yield v }
834+
{ new IAsyncEnumerable<'TResult> with
835+
member _.GetEnumerator() =
836+
new OptimizedMapAsyncEnumerator<'T, 'TResult>(source.GetEnumerator(), f) :> IAsyncEnumerator<'TResult> }
819837

820838
let mapiAsync f (source : AsyncSeq<'T>) : AsyncSeq<'TResult> = asyncSeq {
821839
let i = ref 0L

0 commit comments

Comments
 (0)