From 336ea67ea28484711d6a114705a11ba008b267b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 19 Oct 2025 07:46:36 +0200 Subject: [PATCH] Add Subscribable.flatMapSubscriptionRef --- packages/effect-fc/src/Form.ts | 20 +++++++------------- packages/effect-fc/src/Subscribable.ts | 10 +++++++++- 2 files changed, 16 insertions(+), 14 deletions(-) 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) }, +})