diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 84f6396..6d0648c 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,19 +1,10 @@ import type { Effect } from "effect" import * as ReffuseContext from "./ReffuseContext.js" +import * as Reffuse from "./Reffuse.js" +import type { Simplify } from "effect/Types" -interface ReffuseTest { - readonly contexts: readonly ReffuseContext.ReffuseContext[] - - useEffect(effect: Effect.Effect): void -} - -const ReffuseTestProto = { - useEffect(this: ReffuseTest, effect: Effect.Effect) {} -} - -const make = (): ReffuseTest => { - const self = Object.create(ReffuseTestProto) - self.contexts = [] - return self -} +const make = (extension: T) => + (base: R) => { + const class_ = class extends base {} + } diff --git a/packages/reffuse/src/ReffuseHelper.ts b/packages/reffuse/src/ReffuseHelper.ts new file mode 100644 index 0000000..d41f572 --- /dev/null +++ b/packages/reffuse/src/ReffuseHelper.ts @@ -0,0 +1,57 @@ +import type { Context, Effect, ExecutionStrategy, Fiber, Pipeable, Runtime, Scope, SubscriptionRef } from "effect" +import type * as React from "react" + + +export interface ReffuseHelper extends Pipeable.Pipeable { + useContext(): Context.Context + + useRunSync(): (effect: Effect.Effect) => A + useRunPromise(): (effect: Effect.Effect, options?: { + readonly signal?: AbortSignal + }) => Promise + useRunFork(): (effect: Effect.Effect, options?: Runtime.RunForkOptions) => Fiber.RuntimeFiber + useRunCallback(): (effect: Effect.Effect, options?: Runtime.RunCallbackOptions) => Runtime.Cancel + + useMemo( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions, + ): A + + useMemoScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): A + + useLayoutEffect( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): void + + useFork( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): void + + usePromise( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): Promise + + useRef(value: A): SubscriptionRef.SubscriptionRef + useRefState(ref: SubscriptionRef.SubscriptionRef): readonly [A, React.Dispatch>] +} + + +export interface RenderOptions { + /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ + readonly doNotReExecuteOnRuntimeOrContextChange?: boolean +} + +export interface ScopeOptions { + readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy +}