Core Sairin primitives.

Signals

signal

function signal<T>(path: PathKey, initial: T): Signal<T>

Create a reactive signal at a path.

Signal Class

class Signal<T> {
  readonly id: number;
  readonly path: PathKey;

  get(): T
  set(value: T, options?: { owner?: string }): void
  update(fn: (value: T) => T): void
  subscribe(fn: Subscriber): () => void
  unsubscribe(fn: Subscriber): void
  peek(): T
  get version(): number
}

isSignal

function isSignal<T>(value: unknown): value is Signal<T>

Check if a value is a signal.

Derived

derived

function derived<T>(
  path: PathKey, 
  fn: () => T, 
  options?: { eager?: boolean }
): Derived<T>

Create a computed value.

Derived Class

class Derived<T> {
  readonly id: number;
  readonly path: PathKey;

  get(): T
  subscribe(fn: Subscriber): () => void
  isDirty(): boolean
  peek(): T
  get version(): number
}

Effects

effect

function effect(fn: () => CleanupFn): () => void

Create an effect (runs in next microtask).

effectSync

function effectSync(fn: () => CleanupFn): () => void

Create a synchronous effect.

effectIdle

function effectIdle(fn: () => CleanupFn): () => void

Create an idle effect.

onCleanup

function onCleanup(fn: () => void): void

Register cleanup in an effect.

untracked

function untracked<T>(fn: () => T): T

Run without subscribing.

Batching

batch

function batch(fn: () => void): void

Group updates into one flush.

isFlushing

function isFlushing(): boolean

Currently in a flush?

hasPendingEffects

function hasPendingEffects(): boolean

Effects waiting to run?

Configuration

configureSairin

function configureSairin(config: SairinConfig): void

Configure Sairin behavior.

getSairinConfig

function getSairinConfig(): Readonly<SairinConfig>

Get current config.