From 79a3779005b5addc871dc41ad62b824d6211bda0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 12 Jan 2025 19:14:01 +0100 Subject: [PATCH] Tests --- packages/reffuse/src/Reffuse.tsx | 45 ++++++++++++++++++-------------- packages/reffuse/src/tests.ts | 31 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 packages/reffuse/src/tests.ts diff --git a/packages/reffuse/src/Reffuse.tsx b/packages/reffuse/src/Reffuse.tsx index 00899ab..2f6fdd0 100644 --- a/packages/reffuse/src/Reffuse.tsx +++ b/packages/reffuse/src/Reffuse.tsx @@ -1,32 +1,39 @@ -import { Effect, Fiber, Layer, ManagedRuntime, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Context, Effect, Fiber, FiberRefs, Layer, ManagedRuntime, Ref, Runtime, RuntimeFlags, Scope, Stream, SubscriptionRef } from "effect" import React from "react" -export class Reffuse { +export interface ProviderProps { + readonly layer: Layer.Layer + readonly children?: React.ReactNode +} + + +export class Reffuse { + + readonly Context = React.createContext>(null!) + readonly Provider: React.FC> constructor( - runtime: ManagedRuntime.ManagedRuntime + runtime: Runtime.Runtime ) { - this.Context = React.createContext>(null!) + this.Provider = (props: ProviderProps) => { + const runtime = React.useMemo(() => Runtime.make({ + context: Context.empty(), + runtimeFlags: RuntimeFlags.make(), + fiberRefs: FiberRefs.empty(), + }), []) - this.Provider = (props: { readonly children?: React.ReactNode }) => ( - - ) - - const context = runtime.runtimeEffect.pipe( - Effect.map(r => Layer.succeedContext(r.context)), - runtime.runSync, - ) + return ( + + ) + } } - readonly Context: React.Context> - readonly Provider: React.FC<{ readonly children?: React.ReactNode }> - - useRuntime(): ManagedRuntime.ManagedRuntime { + useRuntime(): Runtime.Runtime { return React.useContext(this.Context) } diff --git a/packages/reffuse/src/tests.ts b/packages/reffuse/src/tests.ts new file mode 100644 index 0000000..1db3454 --- /dev/null +++ b/packages/reffuse/src/tests.ts @@ -0,0 +1,31 @@ +import { Context, Effect, FiberRefs, Layer, Ref, Runtime, RuntimeFlags } from "effect" + + +const runtime = Runtime.make({ + context: Context.empty(), + runtimeFlags: RuntimeFlags.make(), + fiberRefs: FiberRefs.empty(), +}) + + +class MyService extends Effect.Service()("MyServer", { + effect: Effect.gen(function*() { + return { + ref: yield* Ref.make("initial value") + } as const + }) +}) {} + +const MyLayer = Layer.empty.pipe( + Layer.provideMerge(MyService.Default) +) + +const setMyServiceValue = (value: string) => Effect.gen(function*() { + console.log("previous value: ", yield* (yield* MyService).ref) + yield* Ref.set((yield* MyService).ref, value) + console.log("new value: ", yield* (yield* MyService).ref) +}) + + +Runtime.runSync(runtime)(setMyServiceValue("1").pipe(Effect.provide(MyLayer))) +Runtime.runSync(runtime)(setMyServiceValue("2").pipe(Effect.provide(MyLayer)))