File tree Expand file tree Collapse file tree
src/FSharp.Control.AsyncSeq Expand file tree Collapse file tree Original file line number Diff line number Diff 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 0 L
You can’t perform that action at this time.
0 commit comments