From deb23997c532b30392f09bd6d763aacc3c6e6b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 16 Jul 2026 23:51:29 +0200 Subject: [PATCH] Add mapStream --- packages/effect-lens-next/src/View.ts | 19 +++++++++++++++++++ packages/effect-lens/src/Subscribable.ts | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/packages/effect-lens-next/src/View.ts b/packages/effect-lens-next/src/View.ts index bc0160d..f8a6f38 100644 --- a/packages/effect-lens-next/src/View.ts +++ b/packages/effect-lens-next/src/View.ts @@ -99,6 +99,25 @@ export const mapOptionEffect: { onNone: () => Effect.succeed(Option.none()), }))) +/** + * Allows transforming only the `changes` stream of a `View`. + */ +export const mapStream: { + ( + f: (changes: Stream.Stream, NoInfer, NoInfer>) => Stream.Stream, NoInfer, NoInfer>, + ): (self: View) => View + ( + self: View, + f: (changes: Stream.Stream, NoInfer, NoInfer>) => Stream.Stream, NoInfer, NoInfer>, + ): View +} = Function.dual(2, ( + self: View, + f: (changes: Stream.Stream, NoInfer, NoInfer>) => Stream.Stream, NoInfer, NoInfer>, +): View => make({ + get get() { return self.get }, + get changes() { return f(self.changes) }, +})) + /** Converts typed failures from both channels into `Result` values. */ export const result = ( self: View, diff --git a/packages/effect-lens/src/Subscribable.ts b/packages/effect-lens/src/Subscribable.ts index 9e6d107..53fc83c 100644 --- a/packages/effect-lens/src/Subscribable.ts +++ b/packages/effect-lens/src/Subscribable.ts @@ -40,6 +40,25 @@ export const mapOptionEffect: { onNone: () => Effect.succeed(Option.none()), }))) +/** + * Allows transforming only the `changes` stream of a `Subscribable`. + */ +export const mapStream: { + ( + f: (changes: Stream.Stream, NoInfer, NoInfer>) => Stream.Stream, NoInfer, NoInfer>, + ): (self: Subscribable.Subscribable) => Subscribable.Subscribable + ( + self: Subscribable.Subscribable, + f: (changes: Stream.Stream, NoInfer, NoInfer>) => Stream.Stream, NoInfer, NoInfer>, + ): Subscribable.Subscribable +} = Function.dual(2, ( + self: Subscribable.Subscribable, + f: (changes: Stream.Stream, NoInfer, NoInfer>) => Stream.Stream, NoInfer, NoInfer>, +): Subscribable.Subscribable => Subscribable.make({ + get get() { return self.get }, + get changes() { return f(self.changes) }, +})) + /** * Combines the current values and streams of changes from multiple `Subscribable` values. */