diff --git a/packages/reffuse/src/Reffuse.tsx b/packages/reffuse/src/Reffuse.ts similarity index 77% rename from packages/reffuse/src/Reffuse.tsx rename to packages/reffuse/src/Reffuse.ts index 5b4f062..ce959b4 100644 --- a/packages/reffuse/src/Reffuse.tsx +++ b/packages/reffuse/src/Reffuse.ts @@ -1,38 +1,18 @@ -import { Context, Effect, Fiber, Layer, ManagedRuntime, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Context, Effect, Fiber, FiberRefs, Ref, Runtime, RuntimeFlags, Scope, Stream, SubscriptionRef } from "effect" import React from "react" -import * as ReffuseReactContext from "./ReffuseReactContext.js" - - -export interface ProviderProps { - readonly layer: Layer.Layer - readonly children?: React.ReactNode -} +import type * as ReffuseReactContext from "./ReffuseReactContext.js" +import * as ReffuseReactContextProvider from "./ReffuseReactContextProvider.js" export class Reffuse { readonly Context = React.createContext>(null!) - readonly Provider: React.FC> + readonly Provider: ReffuseReactContextProvider.ReffuseReactContextProvider constructor( - runtime: Runtime.Runtime + runtime: Runtime.Runtime ) { - this.Provider = (props: ProviderProps) => { - const value = React.useMemo(() => ({ - runtime, - context: Effect.context().pipe( - Effect.provide(props.layer), - Runtime.runSync(runtime), - ), - }), [props.layer]) - - return ( - - ) - } + this.Provider = ReffuseReactContextProvider.make(runtime, this.Context) } @@ -131,4 +111,8 @@ export class Reffuse { export const make = (): Reffuse => - new Reffuse(ManagedRuntime.make(layer)) + new Reffuse(Runtime.make({ + context: Context.empty(), + runtimeFlags: RuntimeFlags.make(), + fiberRefs: FiberRefs.empty(), + })) diff --git a/packages/reffuse/src/ReffuseReactContextProvider.tsx b/packages/reffuse/src/ReffuseReactContextProvider.tsx index e69de29..f0d0ad7 100644 --- a/packages/reffuse/src/ReffuseReactContextProvider.tsx +++ b/packages/reffuse/src/ReffuseReactContextProvider.tsx @@ -0,0 +1,34 @@ +import { Effect, Runtime, type Layer } from "effect" +import React from "react" +import type * as ReffuseReactContext from "./ReffuseReactContext.js" + + +export interface Props { + readonly layer: Layer.Layer + readonly children?: React.ReactNode +} + +export type ReffuseReactContextProvider = React.FC> + + +export function make( + runtime: Runtime.Runtime, + Context: React.Context>, +) { + return function ReffuseReactContextProvider(props: Props) { + const value = React.useMemo(() => ({ + runtime, + context: Effect.context().pipe( + Effect.provide(props.layer), + Runtime.runSync(runtime), + ), + }), [props.layer]) + + return ( + + ) + } +}