diff --git a/packages/core/src/state.ts b/packages/core/src/state.ts index b6d18818014..324aac83cb7 100644 --- a/packages/core/src/state.ts +++ b/packages/core/src/state.ts @@ -6,9 +6,9 @@ import { Clock, Context, Deferred, Effect, Scope, Semaphore } from "effect" * A replayable transform applied to a draft during reload. * * Domain drafts expose readable and writable state while preserving concise - * plugin/config code. Transforms may perform Effects before returning. + * plugin/config code. Transforms synchronously rebuild derived state. */ -type TransformCallback = (draft: DraftApi) => Effect.Effect | void +type TransformCallback = (draft: DraftApi) => void export type MakeDraft = (state: State) => DraftApi export interface Registration { @@ -87,9 +87,8 @@ export function create(options: Options): Inte }) const apply = (transform: TransformCallback, draft: DraftApi) => - Effect.suspend(() => { - const result = transform(draft) - return Effect.isEffect(result) ? Effect.asVoid(result).pipe(Effect.orDie) : Effect.void + Effect.sync(() => { + transform(draft) }) const materialize = Effect.fnUntraced(function* () { diff --git a/packages/core/test/state.test.ts b/packages/core/test/state.test.ts index b6d45cdc5f3..f2120356c6c 100644 --- a/packages/core/test/state.test.ts +++ b/packages/core/test/state.test.ts @@ -36,7 +36,7 @@ describe("State", () => { }), ) - it.effect("runs effectful transforms during every reload", () => + it.effect("runs transforms during every reload", () => Effect.gen(function* () { let value = "first" const state = State.create({ @@ -44,11 +44,9 @@ describe("State", () => { draft: (draft) => ({ add: (item: string) => draft.values.push(item) }), }) - yield* state.transform((editor) => - Effect.sync(() => { - editor.add(value) - }), - ) + yield* state.transform((editor) => { + editor.add(value) + }) expect(state.get().values).toEqual(["first"]) value = "second"