From e427c51c0db5a4ec37219a45945e69d9a463c5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 17 Jul 2026 00:04:14 +0200 Subject: [PATCH] Fix parameters --- packages/effect-lens-next/src/Lens.ts | 12 +++++----- packages/effect-lens-next/src/View.test.ts | 23 +++++++++++++++++++ packages/effect-lens-next/src/View.ts | 6 ++--- packages/effect-lens/src/Subscribable.test.ts | 23 +++++++++++++++++++ 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/packages/effect-lens-next/src/Lens.ts b/packages/effect-lens-next/src/Lens.ts index d1a7a5c..ee9ebb4 100644 --- a/packages/effect-lens-next/src/Lens.ts +++ b/packages/effect-lens-next/src/Lens.ts @@ -12,7 +12,7 @@ export type LensTypeId = typeof LensTypeId * 2. a `changes` stream that emits every subsequent update to `A`, and * 3. a `modify` effect that can transform the current value. */ -export interface Lens +export interface Lens extends View.View { readonly [LensTypeId]: LensTypeId @@ -35,7 +35,7 @@ export const LensImplTypeId: unique symbol = Symbol.for("@effect-fc/Lens/v4/Lens export type LensImplTypeId = typeof LensImplTypeId export declare namespace LensImpl { - export interface Resolved { + export interface Resolved { readonly value: A readonly commit: ( next: Effect.Effect @@ -47,7 +47,7 @@ export declare namespace LensImpl { } } -export abstract class LensImpl +export abstract class LensImpl extends Pipeable.Class implements Lens { readonly [View.ViewTypeId]: View.ViewTypeId = View.ViewTypeId readonly [LensTypeId]: LensTypeId = LensTypeId @@ -109,7 +109,7 @@ export const asView = ( export declare namespace LensLazyImpl { - export interface Source { + export interface Source { readonly get: Effect.Effect readonly changes: Stream.Stream readonly commit: (a: A) => Effect.Effect @@ -117,7 +117,7 @@ export declare namespace LensLazyImpl { } } -export class LensLazyImpl +export class LensLazyImpl extends LensImpl { constructor( readonly source: LensLazyImpl.Source, @@ -146,7 +146,7 @@ export const make = ( ): Lens => new LensLazyImpl(source) -export class UnwrappedLensImpl +export class UnwrappedLensImpl extends LensImpl { constructor( readonly effect: Effect.Effect, E1, R1> diff --git a/packages/effect-lens-next/src/View.test.ts b/packages/effect-lens-next/src/View.test.ts index 8ba4fb0..9c94b6e 100644 --- a/packages/effect-lens-next/src/View.test.ts +++ b/packages/effect-lens-next/src/View.test.ts @@ -72,6 +72,29 @@ describe("View", () => { expect(result).toEqual(["fallback", ["fallback"]]) }) + test("zipLatestAll combines current values and change streams", async () => { + const zipped = View.zipLatestAll( + View.make({ + get: Effect.succeed(1), + changes: Stream.succeed(2), + }), + View.make({ + get: Effect.succeed("one"), + changes: Stream.succeed("two"), + }), + ) + + const result = await Effect.runPromise(Effect.all([ + zipped.get, + Stream.runCollect(zipped.changes), + ])) + + expect([result[0], Array.from(result[1])]).toEqual([ + [1, "one"], + [[2, "two"]], + ]) + }) + test("focusArrayLength reads the current array length and reflects updates", async () => { const result = await Effect.runPromise( Effect.flatMap( diff --git a/packages/effect-lens-next/src/View.ts b/packages/effect-lens-next/src/View.ts index f8a6f38..63987ca 100644 --- a/packages/effect-lens-next/src/View.ts +++ b/packages/effect-lens-next/src/View.ts @@ -4,7 +4,7 @@ import { Array, type Cause, Chunk, Effect, Function, Iterable, Option, Pipeable, export const ViewTypeId: unique symbol = Symbol.for("@effect-lens/View/View") export type ViewTypeId = typeof ViewTypeId -export interface View extends Pipeable.Pipeable { +export interface View extends Pipeable.Pipeable { readonly [ViewTypeId]: ViewTypeId readonly get: Effect.Effect readonly changes: Stream.Stream @@ -17,13 +17,13 @@ export const ViewImplTypeId: unique symbol = Symbol.for("@effect-fc/Lens/v4/View export type ViewImplTypeId = typeof ViewImplTypeId export declare namespace ViewImpl { - export interface Source { + export interface Source { readonly get: Effect.Effect readonly changes: Stream.Stream } } -export class ViewImpl +export class ViewImpl extends Pipeable.Class implements View { readonly [ViewTypeId]: ViewTypeId = ViewTypeId readonly [ViewImplTypeId]: ViewImplTypeId = ViewImplTypeId diff --git a/packages/effect-lens/src/Subscribable.test.ts b/packages/effect-lens/src/Subscribable.test.ts index 447f14f..ca70106 100644 --- a/packages/effect-lens/src/Subscribable.test.ts +++ b/packages/effect-lens/src/Subscribable.test.ts @@ -71,6 +71,29 @@ describe("Subscribable", () => { expect(result).toEqual(["fallback", ["fallback"]]) }) + test("zipLatestAll combines current values and change streams", async () => { + const zipped = Subscribable.zipLatestAll( + Subscribable.make({ + get: Effect.succeed(1), + changes: Stream.succeed(2), + }), + Subscribable.make({ + get: Effect.succeed("one"), + changes: Stream.succeed("two"), + }), + ) + + const result = await Effect.runPromise(Effect.all([ + zipped.get, + Stream.runCollect(zipped.changes), + ])) + + expect([result[0], Array.from(result[1])]).toEqual([ + [1, "one"], + [[2, "two"]], + ]) + }) + test("focusArrayLength reads the current array length and reflects updates", async () => { const result = await Effect.runPromise( Effect.flatMap(