From c60c396054126da9b180eea2da236f29f3d7cf1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 13 Jan 2025 23:38:46 +0100 Subject: [PATCH] Inheritance work --- packages/reffuse/src/Reffuse.ts | 15 +++++--- packages/reffuse/src/ReffuseReactContext.ts | 7 ---- packages/reffuse/src/ReffuseReactContext.tsx | 39 ++++++++++++++++++++ 3 files changed, 49 insertions(+), 12 deletions(-) delete mode 100644 packages/reffuse/src/ReffuseReactContext.ts create mode 100644 packages/reffuse/src/ReffuseReactContext.tsx diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 7b307d1..5b5a4e9 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -4,23 +4,28 @@ import type * as ReffuseReactContext from "./ReffuseReactContext.js" import * as ReffuseReactContextProvider from "./ReffuseReactContextProvider.js" -export class Reffuse { +export class Reffuse< + R extends RuntimeR | ContextR, + RuntimeR, + ContextR, + Parent extends Reffuse, +> { - readonly Context = React.createContext>(null!) + readonly Context = React.createContext>(null!) readonly Provider: ReffuseReactContextProvider.ReffuseReactContextProvider constructor( - runtime: Runtime.Runtime + runtime: Runtime.Runtime ) { this.Provider = ReffuseReactContextProvider.make(runtime, this.Context) } - useRuntime(): Runtime.Runtime { + useRuntime(): Runtime.Runtime { return React.useContext(this.Context).runtime } - useContext(): Context.Context { + useContext(): Context.Context { return React.useContext(this.Context).context } diff --git a/packages/reffuse/src/ReffuseReactContext.ts b/packages/reffuse/src/ReffuseReactContext.ts deleted file mode 100644 index 54c6552..0000000 --- a/packages/reffuse/src/ReffuseReactContext.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Context, Runtime } from "effect" - - -export interface ReffuseReactContext { - readonly runtime: Runtime.Runtime - readonly context: Context.Context -} diff --git a/packages/reffuse/src/ReffuseReactContext.tsx b/packages/reffuse/src/ReffuseReactContext.tsx new file mode 100644 index 0000000..9d6ea48 --- /dev/null +++ b/packages/reffuse/src/ReffuseReactContext.tsx @@ -0,0 +1,39 @@ +import { Effect, Runtime, type Context, type Layer } from "effect" +import React from "react" + + +export interface Value { + readonly runtime: Runtime.Runtime + readonly context: Context.Context +} + + +export interface ProviderProps { + readonly layer: Layer.Layer + readonly children?: React.ReactNode +} + +export type Provider = React.FC> + + +export function makeProvider( + runtime: Runtime.Runtime, + Context: React.Context>, +) { + return function ReffuseReactContextProvider(props: ProviderProps) { + const value = React.useMemo(() => ({ + runtime, + context: Effect.context().pipe( + Effect.provide(props.layer), + Runtime.runSync(runtime), + ), + }), [props.layer]) + + return ( + + ) + } +}