Skip to content

Commit 0afeff0

Browse files
authored
Merge pull request #232 from fsprojects/copilot/sub-pr-231
[WIP] Fix AsyncSeq migration issues and Fable feedback
2 parents 1b823eb + 2e76a84 commit 0afeff0

2 files changed

Lines changed: 39 additions & 2 deletions

File tree

src/FSharp.Control.AsyncSeq/AsyncSeq.fs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ type IAsyncSeqEnumerator<'T> =
2626
abstract MoveNext : unit -> Async<'T option>
2727
inherit IDisposable
2828

29+
#if FABLE_COMPILER
30+
/// AsyncSeq<'T> for Fable: a library-specific interface that avoids ValueTask.
31+
[<NoEquality; NoComparison>]
32+
type AsyncSeq<'T> =
33+
abstract GetEnumerator : unit -> IAsyncSeqEnumerator<'T>
34+
35+
/// Adapter: wraps an internal pull-enumerator factory into an AsyncSeq<'T>.
36+
[<Sealed>]
37+
type AsyncSeqImpl<'T>(getEnum: unit -> IAsyncSeqEnumerator<'T>) =
38+
member _.GetInternalEnumerator() = getEnum()
39+
interface AsyncSeq<'T> with
40+
member _.GetEnumerator() = getEnum()
41+
#else
2942
/// AsyncSeq<'T> is now the BCL IAsyncEnumerable<'T>.
3043
type AsyncSeq<'T> = System.Collections.Generic.IAsyncEnumerable<'T>
3144

@@ -72,6 +85,7 @@ module AsyncSeqEnumeratorExtensions =
7285
else return None }
7386
interface System.IDisposable with
7487
member _.Dispose() = e.DisposeAsync() |> ignore }
88+
#endif
7589

7690
#if !FABLE_COMPILER
7791
type AsyncSeqSrc<'a> = private { tail : AsyncSeqSrcNode<'a> ref }
@@ -400,10 +414,16 @@ module AsyncSeqOp =
400414
| None ->
401415
return None }
402416
new UnfoldAsyncEnumerator<'S, 'U> (h, init) :> _
417+
#if FABLE_COMPILER
418+
interface AsyncSeq<'T> with
419+
member __.GetEnumerator() =
420+
new OptimizedUnfoldEnumerator<'S, 'T>(f, init) :> IAsyncSeqEnumerator<'T>
421+
#else
403422
interface System.Collections.Generic.IAsyncEnumerable<'T> with
404423
member __.GetAsyncEnumerator(ct) =
405424
(AsyncSeqImpl(fun () -> new OptimizedUnfoldEnumerator<'S, 'T>(f, init) :> IAsyncSeqEnumerator<'T>)
406425
:> System.Collections.Generic.IAsyncEnumerable<'T>).GetAsyncEnumerator(ct)
426+
#endif
407427

408428

409429

@@ -1921,13 +1941,15 @@ module AsyncSeq =
19211941
#if !FABLE_COMPILER
19221942

19231943
/// Converts a BCL IAsyncEnumerable to AsyncSeq. Identity function since AsyncSeq<'T> IS IAsyncEnumerable<'T> in v4+.
1944+
[<Obsolete("AsyncSeq<'T> is now identical to IAsyncEnumerable<'T>. This function is a no-op and can be removed.")>]
19241945
let ofAsyncEnum (source: System.Collections.Generic.IAsyncEnumerable<'T>) : AsyncSeq<'T> = source
19251946

19261947
/// Returns the AsyncSeq as a BCL IAsyncEnumerable<'a>. Identity function since AsyncSeq<'a> IS IAsyncEnumerable<'a> in v4+.
1948+
[<Obsolete("AsyncSeq<'T> is now identical to IAsyncEnumerable<'T>. This function is a no-op and can be removed.")>]
19271949
let toAsyncEnum (source: AsyncSeq<'a>) : System.Collections.Generic.IAsyncEnumerable<'a> = source
19281950

1929-
let ofIQueryable (query : IQueryable<'a>) =
1930-
query :?> Collections.Generic.IAsyncEnumerable<'a> |> ofAsyncEnum
1951+
let ofIQueryable (query : IQueryable<'a>) : AsyncSeq<'a> =
1952+
query :?> Collections.Generic.IAsyncEnumerable<'a>
19311953

19321954
module AsyncSeqSrcImpl =
19331955

src/FSharp.Control.AsyncSeq/AsyncSeq.fsi

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,23 @@ namespace FSharp.Control
33

44
open System
55

6+
#if FABLE_COMPILER
7+
/// Internal pull-based enumerator used by AsyncSeq<'T> in Fable builds.
8+
[<NoEquality; NoComparison>]
9+
type IAsyncSeqEnumerator<'T> =
10+
abstract MoveNext : unit -> Async<'T option>
11+
inherit IDisposable
12+
13+
/// An asynchronous sequence.
14+
[<NoEquality; NoComparison>]
15+
type AsyncSeq<'T> =
16+
abstract GetEnumerator : unit -> IAsyncSeqEnumerator<'T>
17+
#else
618
/// An asynchronous sequence; equivalent to System.Collections.Generic.IAsyncEnumerable<'T>.
719
/// Use the asyncSeq { ... } computation expression to create values, and the AsyncSeq module
820
/// for combinators.
921
type AsyncSeq<'T> = System.Collections.Generic.IAsyncEnumerable<'T>
22+
#endif
1023

1124
[<RequireQualifiedAccess>]
1225
module AsyncSeq =
@@ -559,9 +572,11 @@ module AsyncSeq =
559572
#if (NETSTANDARD || NET)
560573

561574
/// Returns the input AsyncSeq as a BCL IAsyncEnumerable<'T>. Identity since AsyncSeq<'T> IS IAsyncEnumerable<'T> in v4.
575+
[<Obsolete("AsyncSeq<'T> is now identical to IAsyncEnumerable<'T>. This function is a no-op and can be removed.")>]
562576
val ofAsyncEnum<'T> : source: Collections.Generic.IAsyncEnumerable<'T> -> AsyncSeq<'T>
563577

564578
/// Returns the input AsyncSeq as a BCL IAsyncEnumerable<'T>. Identity since AsyncSeq<'T> IS IAsyncEnumerable<'T> in v4.
579+
[<Obsolete("AsyncSeq<'T> is now identical to IAsyncEnumerable<'T>. This function is a no-op and can be removed.")>]
565580
val toAsyncEnum<'T> : source: AsyncSeq<'T> -> Collections.Generic.IAsyncEnumerable<'T>
566581

567582
val ofIQueryable<'T> : source: Linq.IQueryable<'T> -> AsyncSeq<'T>

0 commit comments

Comments
 (0)