Add View.useFromReactiveValues (#78)
Lint / lint (push) Successful in 26s
Publish / publish (push) Successful in 1m54s

## Summary
- Add `View.useFromReactiveValues`, a `View`-side counterpart to `Lens.useFromReactState`: exposes a React dependency list (values that change across renders) as a live-updating `View`, backed by a `SubscriptionRef` kept in sync via `useReactEffect`.

## Test plan
- [x] `bun run lint:tsc`
- [x] `bun run lint:biome`
- [x] `bun run test`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Julien Valverdé <julien.valverde@mailo.com>
Reviewed-on: #78
This commit was merged in pull request #78.
This commit is contained in:
ThilawynandJulien Valverdé committed 2026-09-25 23:21:27 +02:00
1 parent 19ae5a366d
commit 7f2782676b
2 files changed
+15 -3

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "effect-view",
"description": "Write React function components with Effect",
"version": "0.1.6",
"version": "0.1.7",
"type": "module",
"files": [
"./README.md",
+14 -2
View File
@@ -1,5 +1,5 @@
import { Effect, Equivalence, Stream } from "effect"
import { View } from "effect-lens"
import { Effect, Equivalence, Stream, SubscriptionRef } from "effect"
import { Lens, View } from "effect-lens"
import * as React from "react"
import * as Component from "./Component.js"
@@ -40,3 +40,15 @@ export const useAll = Effect.fnUntraced(function* <const T extends readonly View
return reactStateValue as any
})
export const useFromReactiveValues = Effect.fnUntraced(function* <const A extends React.DependencyList>(
values: A,
): Effect.fn.Return<View.View<A, never, never>> {
const lens = yield* Component.useOnMount(() => Effect.map(
SubscriptionRef.make(values),
Lens.fromSubscriptionRef,
))
yield* Component.useReactEffect(() => Lens.set(lens, values), values)
return lens
})