diff --git a/packages/effect-fc/src/Form.ts b/packages/effect-fc/src/Form.ts index 11b2a62..9aeefc7 100644 --- a/packages/effect-fc/src/Form.ts +++ b/packages/effect-fc/src/Form.ts @@ -199,19 +199,13 @@ export const field = Effect.andThen( - ParseResult.ArrayFormatter.formatError(v), - Array.filter(issue => PropertyPath.equivalence(issue.path, path)), - ), - onNone: () => Effect.succeed([]), - }), - filter => SubscribableInternal.make({ - get: Effect.flatMap(self.errorRef.get, filter), - get changes() { return Stream.flatMap(self.errorRef.changes, filter) }, - }), - ), + SubscribableInternal.flatMapSubscriptionRef(self.errorRef, Option.match({ + onSome: flow( + ParseResult.ArrayFormatter.formatError, + Effect.map(Array.filter(issue => PropertyPath.equivalence(issue.path, path))), + ), + onNone: () => Effect.succeed([]), + })), pipe( Option.isSome, diff --git a/packages/effect-fc/src/Subscribable.ts b/packages/effect-fc/src/Subscribable.ts index 3325fdc..416c6ea 100644 --- a/packages/effect-fc/src/Subscribable.ts +++ b/packages/effect-fc/src/Subscribable.ts @@ -1,4 +1,4 @@ -import { type Effect, Effectable, Readable, type Stream, Subscribable } from "effect" +import { Effect, Effectable, Readable, Stream, Subscribable, type SubscriptionRef } from "effect" class SubscribableImpl @@ -22,3 +22,11 @@ export const make = (values: { readonly get: Effect.Effect readonly changes: Stream.Stream }): Subscribable.Subscribable => new SubscribableImpl(values.get, values.changes) + +export const flatMapSubscriptionRef = ( + ref: SubscriptionRef.SubscriptionRef, + flatMap: (value: NoInfer) => Effect.Effect, +): Subscribable.Subscribable => make({ + get: Effect.flatMap(ref, flatMap), + get changes() { return Stream.flatMap(ref.changes, flatMap) }, +})