diff --git a/packages/effect-lens/src/Lens.ts b/packages/effect-lens/src/Lens.ts index 5210b17..a5d1082 100644 --- a/packages/effect-lens/src/Lens.ts +++ b/packages/effect-lens/src/Lens.ts @@ -79,7 +79,7 @@ export const asLensImpl = ( lens: Lens ): LensImpl => { if (!isLensImpl(lens)) - throw new Error("Not a 'LensImpl'.") + throw new Error("Not a 'LensImpl'") return lens as LensImpl } @@ -122,67 +122,6 @@ export const make = ( ): Lens => new LensLazyImpl(source) -export declare namespace DerivedLensImpl { - export interface Source< - in out A, - in out B, - in out ER = never, - in out ESR = never, - in out EW = never, - in out ESW = never, - in out RR = never, - in out RSR = never, - in out RW = never, - in out RSW = never, - > { - readonly resolve: (effect: Effect.Effect, ESR, RSR>) => Effect.Effect, ER, RR> - readonly mapStream: (stream: Stream.Stream) => Stream.Stream - readonly mapLock: (lock: Effect.Effect) => Effect.Effect - } -} - -export class DerivedLensImpl< - in out A, - in out B, - in out ER = never, - in out PER = never, - in out EW = never, - in out PEW = never, - in out RR = never, - in out PRR = never, - in out RW = never, - in out PRW = never, -> -extends LensImpl { - constructor( - readonly parent: LensImpl, - readonly source: DerivedLensImpl.Source, - ) { - super() - } - - get resolve() { return this.source.resolve(this.parent.resolve) } - get changes() { return this.source.mapStream(this.parent.changes) } - get lock() { return this.source.mapLock(this.parent.lock) } -} - -/** - * Derives a new `Lens` by linking a step to an existing parent lens. - */ -export const derive: { - ( - self: Lens, - source: DerivedLensImpl.Source, - ): Lens - ( - source: DerivedLensImpl.Source, - ): (self: Lens) => Lens -} = Function.dual(2, ( - self: Lens, - source: DerivedLensImpl.Source, -): Lens => new DerivedLensImpl(asLensImpl(self), source)) - - export class UnwrappedLensImpl extends LensImpl { constructor( @@ -337,6 +276,67 @@ export const fromSubscriptionRef = ( ): Lens => new SubscriptionRefLensImpl(ref as SubscriptionRefLensImpl.SubscriptionRefWithInternals) +export declare namespace DerivedLensImpl { + export interface Source< + in out A, + in out B, + in out ER = never, + in out ESR = never, + in out EW = never, + in out ESW = never, + in out RR = never, + in out RSR = never, + in out RW = never, + in out RSW = never, + > { + readonly resolve: (effect: Effect.Effect, ESR, RSR>) => Effect.Effect, ER, RR> + readonly mapStream: (stream: Stream.Stream) => Stream.Stream + readonly mapLock: (lock: Effect.Effect) => Effect.Effect + } +} + +export class DerivedLensImpl< + in out A, + in out B, + in out ER = never, + in out PER = never, + in out EW = never, + in out PEW = never, + in out RR = never, + in out PRR = never, + in out RW = never, + in out PRW = never, +> +extends LensImpl { + constructor( + readonly parent: LensImpl, + readonly source: DerivedLensImpl.Source, + ) { + super() + } + + get resolve() { return this.source.resolve(this.parent.resolve) } + get changes() { return this.source.mapStream(this.parent.changes) } + get lock() { return this.source.mapLock(this.parent.lock) } +} + +/** + * Derives a new `Lens` by linking a step to an existing parent lens. + */ +export const derive: { + ( + self: Lens, + source: DerivedLensImpl.Source, + ): Lens + ( + source: DerivedLensImpl.Source, + ): (self: Lens) => Lens +} = Function.dual(2, ( + self: Lens, + source: DerivedLensImpl.Source, +): Lens => new DerivedLensImpl(asLensImpl(self), source)) + + /** * Derives a new `Lens` by applying synchronous getters and setters over the focused value. */