Skip to content

Overview

Build reactive state for .NET: update a value, and the computations that depend on it update too.

  • Signals hold values you can read and write.
  • Memos derive values from tracked reads.
  • Effects run when a value they read changes.
  • Bindings copy one fixed signal or memo into an external target.

A taste

open Ranvier

let graph = new Graph ()

let doubled =
    graph.Run (fun () ->
        let count = createSignal 1
        let doubled = createMemo (fun _ -> count.Value * 2)
        createEffect (fun () -> printfn "doubled = %d" doubled.Value)
        count.Value <- 5
        doubled)
doubled = 2
doubled = 10

What you get

Targets

net10.0, netstandard2.1 and Fable (JavaScript).

Guide

Status

Implementation status and planned features
AreaStatus
Core graph (signal, memo, effect, owners, batching)Implemented and tested.
Fixed-dependency bindingsbindSignal and bindMemo provide owned, untracked writes from one declared source; see Bindings.
Debounce and throttleImplemented with eager capture, timed publication and injectable clocks; see Timing.
Per-node typed comparersImplemented for signals, memos, split effects and boundaries; see Equality.
Editable keyed collections and value readersImplemented, with direct row edits and bounded change cursors; see Direct edits and Reading changes.
Async and boundariesImplemented. A pending .Value read throws NotReadyException; TryValue reads without throwing.
Per-node flight policiesImplemented: createAsyncWithPolicy and createOwningAsyncWithPolicy override the graph's policy for one async memo; see Async memos.
Stream memos (createStream, createStreamFold)Implemented and tested; see Streams.
Projections, lookups and selectorsImplemented, including memo-free factory rows, opt-in create-first passes and trimmed reconciliation; see Projections.
Fable/JavaScriptImplemented; package builds contain standalone Fable source projects. CI checks repository tests and packed consumers. See Fable (JavaScript) target.
Collection combinators (Projection.filter, choose, map, mapWith, sortBy, groupBy)Implemented and tested, including pending and error behaviour; see Collections.
Editable values (createEditable, createDraft) and the MVU bridge (Mvu, in the Ranvier.Elmish package)Implemented and tested; see Editable values and forms and Migrating from Elmish.
Shared remote queries and mutationsImplemented in Ranvier.Query, with acquired leases, retained refresh data and atomic reconciliation; see Queries and mutations.
Reusable lens and prism values for deep writesNot implemented; they wait on a need for reusable focus paths over collections.
Edit this page