To use the raw R3 from F# you would add first the NuGet package to R3:
Then, this is a working sample:
open System
// Create a bus
use r3Bus = new R3.Subject<int> ()
// Filter events
let interesting = R3.ObservableExtensions.Where (r3Bus, fun x -> x % 2 = 0)
// Subscribe to events
let subscription =
R3.ObservableExtensions.SubscribeAwait (
interesting,
fun i cancellationToken ->
task {
// Listen events
printfn "%i" i
return ()
}
|> System.Threading.Tasks.ValueTask
)
// Publish some events
[ 1..10 ] |> List.iter r3Bus.OnNext
As you can see, this is nice, but a little bit noisy.
This package will come top help.
Then you do:
paket install FSharp.Control.R3
|
Now you can use functions closer to the traditional F#-style, like:
// Filter events
let interesting = r3Bus |> FSharp.Control.R3.Observable.filter (fun x -> x % 2 = 0)
namespace System
val r3Bus: obj
Multiple items
val int: value: 'T -> int (requires member op_Explicit)
--------------------
type int = int32
--------------------
type int<'Measure> =
int
val interesting: obj
val subscription: obj
val task: TaskBuilder
val printfn: format: Printf.TextWriterFormat<'T> -> 'T
namespace System.Threading
namespace System.Threading.Tasks
Multiple items
[<Struct>]
type ValueTask<'TResult> =
new: source: IValueTaskSource<'TResult> * token: int16 -> unit + 2 overloads
member AsTask: unit -> Task<'TResult>
member ConfigureAwait: continueOnCapturedContext: bool -> ConfiguredValueTaskAwaitable<'TResult>
member Equals: obj: obj -> bool + 1 overload
member GetAwaiter: unit -> ValueTaskAwaiter<'TResult>
member GetHashCode: unit -> int
member Preserve: unit -> ValueTask<'TResult>
member ToString: unit -> string
static member (<>) : left: ValueTask<'TResult> * right: ValueTask<'TResult> -> bool
static member (=) : left: ValueTask<'TResult> * right: ValueTask<'TResult> -> bool
...
<summary>Provides a value type that wraps a <see cref="T:System.Threading.Tasks.Task`1" /> and a <typeparamref name="TResult" />, only one of which is used.</summary>
<typeparam name="TResult">The result.</typeparam>
--------------------
[<Struct>]
type ValueTask =
new: source: IValueTaskSource * token: int16 -> unit + 1 overload
member AsTask: unit -> Task
member ConfigureAwait: continueOnCapturedContext: bool -> ConfiguredValueTaskAwaitable
member Equals: obj: obj -> bool + 1 overload
member GetAwaiter: unit -> ValueTaskAwaiter
member GetHashCode: unit -> int
member Preserve: unit -> ValueTask
static member (<>) : left: ValueTask * right: ValueTask -> bool
static member (=) : left: ValueTask * right: ValueTask -> bool
static member FromCanceled: cancellationToken: CancellationToken -> ValueTask + 1 overload
...
<summary>Provides an awaitable result of an asynchronous operation.</summary>
--------------------
Threading.Tasks.ValueTask ()
Threading.Tasks.ValueTask(task: Threading.Tasks.Task<'TResult>) : Threading.Tasks.ValueTask<'TResult>
Threading.Tasks.ValueTask(result: 'TResult) : Threading.Tasks.ValueTask<'TResult>
Threading.Tasks.ValueTask(source: Threading.Tasks.Sources.IValueTaskSource<'TResult>, token: int16) : Threading.Tasks.ValueTask<'TResult>
--------------------
Threading.Tasks.ValueTask ()
Threading.Tasks.ValueTask(task: Threading.Tasks.Task) : Threading.Tasks.ValueTask
Threading.Tasks.ValueTask(source: Threading.Tasks.Sources.IValueTaskSource, token: int16) : Threading.Tasks.ValueTask
Multiple items
module List
from Microsoft.FSharp.Collections
--------------------
type List<'T> =
| op_Nil
| op_ColonColon of Head: 'T * Tail: 'T list
interface IReadOnlyList<'T>
interface IReadOnlyCollection<'T>
interface IEnumerable
interface IEnumerable<'T>
member GetReverseIndex: rank: int * offset: int -> int
member GetSlice: startIndex: int option * endIndex: int option -> 'T list
static member Cons: head: 'T * tail: 'T list -> 'T list
member Head: 'T
member IsEmpty: bool
member Item: index: int -> 'T with get
...
val iter: action: ('T -> unit) -> list: 'T list -> unit
namespace Microsoft.FSharp
namespace Microsoft.FSharp.Control