Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Breaking:** `AwaitOperationConfiguration` cases are prefixed with `Await` (`AwaitSequential`, `AwaitParallel 4`, ...) so they no longer collide with `System.Threading.Tasks.Parallel`
- **Breaking:** the `Async` functions raise the original exception instead of an `AggregateException`, and a cancelled operation cancels the computation instead of failing it
- **Breaking:** the `Async` `toLookup` overloads no longer take a `cancellationToken`; they observe the token of the computation
- **Breaking:** the `Task` `toArray` and `toList` are curried functions of the `Task.Observable` module taking the token first: `Observable.toArray ct source`
- **Breaking:** `ofTask` defaults `configureAwait` to `true`, like R3 and `ofAsync`
- **Breaking:** the `OptionExtensions`/`ValueOptionExtensions` types are replaced by `Observable.choose`, which takes a `voption` chooser, and `ObservableOption.choose` for `option`; the `Observable.Extensions` type is replaced by `Observable.ofSeq`
- **Breaking:** after `open FSharp.Control.R3`, `Observable.choose` is the R3 function, like `Observable.map` and `Observable.filter` already were; use `Microsoft.FSharp.Control.Observable.choose` for `IObservable` and F# events
Expand Down
48 changes: 35 additions & 13 deletions src/FSharp.Control.R3/TaskObservable.fs
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,25 @@ module Observable =
guard.ThrowIfFailed ()
}

// toArray and toList are curried module functions taking the token first, like every other function of this module.
// As static members of the extension type they were shadowed by the Async module functions whenever both flavours were opened.

/// Collects the elements of the source into an array once it completes.
let toArray (cancellationToken : CancellationToken) (source : Observable<'T>) = ObservableExtensions.ToArrayAsync (source, cancellationToken)

/// Collects the elements of the source into a list once it completes.
let toList (cancellationToken : CancellationToken) (source : Observable<'T>) = task {
let! array = ObservableExtensions.ToArrayAsync (source, cancellationToken)
return List.ofArray array
}

[<AutoOpen>]
module Extensions =

open System.Runtime.CompilerServices
open System.Collections.Generic
open System.Runtime.InteropServices

[<AbstractClass; Sealed; Extension>]
[<AbstractClass; Sealed>]
type Observable private () =

/// <summary>
Expand Down Expand Up @@ -139,23 +151,33 @@ module Extensions =
=
Observable.FromAsync (asyncFactory, configureAwait)

static member inline toArray (source, [<Optional>] cancellationToken) = ObservableExtensions.ToArrayAsync (source, cancellationToken)

static member toList (source, [<Optional>] cancellationToken) = task {
let! array = ObservableExtensions.ToArrayAsync (source, cancellationToken)
return List.ofArray array
}

static member toLookup (source, keySelector : 'T -> 'Key, [<Optional>] cancellationToken) =
static member toLookup (source : Observable<'T>, keySelector : 'T -> 'Key, [<Optional>] cancellationToken : CancellationToken) =
ObservableExtensions.ToLookupAsync (source, keySelector, cancellationToken)

static member toLookup (source, keySelector : 'T -> 'Key, keyComparer, [<Optional>] cancellationToken) =
static member toLookup
(
source : Observable<'T>,
keySelector : 'T -> 'Key,
keyComparer : IEqualityComparer<'Key>,
[<Optional>] cancellationToken : CancellationToken
)
=
ObservableExtensions.ToLookupAsync (source, keySelector, keyComparer = keyComparer, cancellationToken = cancellationToken)

static member toLookup (source, keySelector : 'T -> 'Key, elementSelector : 'T -> 'Element, [<Optional>] cancellationToken) =
static member toLookup
(source : Observable<'T>, keySelector : 'T -> 'Key, elementSelector : 'T -> 'Element, [<Optional>] cancellationToken : CancellationToken)
=
ObservableExtensions.ToLookupAsync (source, keySelector, elementSelector = elementSelector, cancellationToken = cancellationToken)

static member toLookup (source, keySelector : 'T -> 'Key, elementSelector : 'T -> 'Element, keyComparer, [<Optional>] cancellationToken) =
static member toLookup
(
source : Observable<'T>,
keySelector : 'T -> 'Key,
elementSelector : 'T -> 'Element,
keyComparer : IEqualityComparer<'Key>,
[<Optional>] cancellationToken : CancellationToken
)
=
ObservableExtensions.ToLookupAsync (
source,
keySelector,
Expand Down
Loading