import { Effect, type Layer, ManagedRuntime, Runtime } from "effect" import * as React from "react" export interface ReactManagedRuntime { readonly runtime: ManagedRuntime.ManagedRuntime readonly context: React.Context> } export const make = ( layer: Layer.Layer, memoMap?: Layer.MemoMap, ): ReactManagedRuntime => ({ runtime: ManagedRuntime.make(layer, memoMap), context: React.createContext>(null!), }) export interface SyncProviderProps { readonly runtime: ReactManagedRuntime readonly children?: React.ReactNode } export const SyncProvider = ( props: SyncProviderProps ): React.ReactNode => React.createElement(props.runtime.context, { value: React.useMemo(() => Effect.runSync(props.runtime.runtime.runtimeEffect), [props.runtime]), children: props.children, }) SyncProvider.displayName = "ReactManagedRuntimeSyncProvider"