diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000..407e203 Binary files /dev/null and b/bun.lockb differ diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 291ffca..3284391 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -24,5 +24,9 @@ "clean:node": "rm -rf node_modules" }, "devDependencies": { + "@types/react": "^19.0.4", + "effect": "^3.12.1", + "react": "^19.0.0", + "typescript": "^5.7.3" } } diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts new file mode 100644 index 0000000..d54fe14 --- /dev/null +++ b/packages/reffuse/src/Reffuse.ts @@ -0,0 +1,50 @@ +import { Effect, Exit, ManagedRuntime } from "effect" +import { createContext, useContext, type Context, type ReactNode } from "react" + + +export class Reffuse { + + constructor( + private readonly runtime: ManagedRuntime.ManagedRuntime + ) { + this.Context = createContext(runtime) + } + + readonly Context: Context> + + Provider(props: { readonly children: ReactNode }) { + return this.Context.Provider({ + ...props, + value: this.runtime, + }) + } + + + useRuntime(): ManagedRuntime.ManagedRuntime { + return useContext(this.Context) + } + + + runSync(effect: Effect.Effect): A { + return this.useRuntime().runSync(effect) + } + + runSyncExit(effect: Effect.Effect): Exit.Exit { + return this.useRuntime().runSyncExit(effect) + } + + runPromise( + effect: Effect.Effect, + options?: { readonly signal?: AbortSignal }, + ): Promise { + return this.useRuntime().runPromise(effect, options) + } + + runPromiseExit( + effect: Effect.Effect, + options?: { readonly signal?: AbortSignal }, + ): Promise> { + return this.useRuntime().runPromiseExit(effect, options) + } + +} diff --git a/packages/reffuse/src/index.ts b/packages/reffuse/src/index.ts index e69de29..b5dfcef 100644 --- a/packages/reffuse/src/index.ts +++ b/packages/reffuse/src/index.ts @@ -0,0 +1 @@ +export * as Reffuse from "./Reffuse.js"