diff --git a/packages/effect-fc/src/Result.ts b/packages/effect-fc/src/Result.ts index 42b0c1a..b496ce7 100644 --- a/packages/effect-fc/src/Result.ts +++ b/packages/effect-fc/src/Result.ts @@ -212,24 +212,24 @@ export const unsafeForkEffect = Effect.fnUntraced(function* never, Scope.Scope | unsafeForkEffect.OutputContext > { - const ref = yield* SynchronizedRef.make>(options?.initial ?? initial()) + const ref = (yield* SynchronizedRef.make( + options?.initial ?? initial() + )) as Lens.SynchronizedRefLensImpl.SynchronizedRefWithInternals> const pubsub = yield* PubSub.unbounded>() const state = Lens.make, never, never, never, never>({ - get get() { return Ref.get(ref) }, + get get() { return Ref.get(ref.ref) }, get changes() { return Stream.unwrapScoped(Effect.map( - Effect.all([Ref.get(ref), Stream.fromPubSub(pubsub, { scoped: true })]), + Effect.all([Ref.get(ref.ref), Stream.fromPubSub(pubsub, { scoped: true })]), ([latest, stream]) => Stream.concat(Stream.make(latest), stream), )) }, - modify: f => Ref.get(ref).pipe( - Effect.flatMap(f), - Effect.flatMap(([b, a]) => Ref.set(ref, a).pipe( - Effect.as(b), - Effect.zipLeft(PubSub.publish(pubsub, a)) - )), + commit: value => Effect.zipLeft( + Ref.set(ref.ref, value), + PubSub.publish(pubsub, value), ), + lock: Effect.succeed(ref.withLock), }) const fiber = yield* Effect.gen(function*() { diff --git a/packages/effect-fc/src/SubmittableForm.ts b/packages/effect-fc/src/SubmittableForm.ts index f83d579..a1f1009 100644 --- a/packages/effect-fc/src/SubmittableForm.ts +++ b/packages/effect-fc/src/SubmittableForm.ts @@ -53,27 +53,24 @@ extends Pipeable.Class() implements SubmittableForm { ) { super() - this.encodedValue = Effect.succeed(this).pipe( - Effect.map(self => Lens.make({ - get get() { return self.internalEncodedValue.get }, - get changes() { return self.internalEncodedValue.changes }, - modify: f => self.internalEncodedValue.modify( - encodedValue => Effect.map( - f(encodedValue), - ([b, nextEncodedValue]) => [ - [b, nextEncodedValue] as const, - nextEncodedValue, - ] as const, - ) - ).pipe( - Effect.tap(([, nextEncodedValue]) => - self.synchronizeEncodedValue(nextEncodedValue).pipe( - Effect.forkScoped, - Effect.provide(self.context), - ) + this.encodedValue = Effect.all([ + Effect.succeed(this), + Effect.succeed(Lens.asLensImpl(this.internalEncodedValue)), + ]).pipe( + Effect.map(([self, parent]) => Lens.make({ + get: parent.get, + get changes() { return parent.changes }, + commit: a => Effect.andThen( + Effect.flatMap( + parent.resolve, + resolved => resolved.commit(Effect.succeed(a)), + ), + self.synchronizeEncodedValue(a).pipe( + Effect.forkScoped, + Effect.provide(self.context), ), - Effect.map(([b]) => b), ), + lock: parent.lock, })), Lens.unwrap, ) diff --git a/packages/effect-fc/src/SynchronizedForm.ts b/packages/effect-fc/src/SynchronizedForm.ts index 119d107..6f4777f 100644 --- a/packages/effect-fc/src/SynchronizedForm.ts +++ b/packages/effect-fc/src/SynchronizedForm.ts @@ -15,7 +15,7 @@ export interface SynchronizedForm< in out TEW = never, in out TRR = never, in out TRW = never, -> extends Form.Form { +> extends Form.Form { readonly [SynchronizedFormTypeId]: SynchronizedFormTypeId readonly schema: Schema.Schema @@ -41,7 +41,7 @@ export class SynchronizedFormImpl< readonly path = [] as const readonly value: Subscribable.Subscribable, never, never> - readonly encodedValue: Lens.Lens + readonly encodedValue: Lens.Lens readonly isValidating: Subscribable.Subscribable readonly canCommit: Subscribable.Subscribable @@ -78,7 +78,7 @@ export class SynchronizedFormImpl< Effect.succeed(this), Effect.succeed(Lens.asLensImpl(this.internalEncodedValue)), ]).pipe( - Effect.map(([self, parent]) => Lens.make({ + Effect.map(([self, parent]) => Lens.make({ get: parent.get, get changes() { return parent.changes }, commit: a => Effect.andThen(