0.2.5 #43
@@ -1,4 +1,4 @@
|
|||||||
import { Chunk, Effect, Pipeable, Predicate, Readable, Ref, Stream, Subscribable, SubscriptionRef } from "effect"
|
import { Chunk, Effect, Function, Pipeable, Predicate, Readable, Stream, Subscribable, SubscriptionRef } from "effect"
|
||||||
|
|
||||||
|
|
||||||
export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens")
|
export const LensTypeId: unique symbol = Symbol.for("@effect-fc/Lens/Lens")
|
||||||
@@ -65,9 +65,9 @@ export const make = <A, ER, RR, EW, RW>(
|
|||||||
export const fromSubscriptionRef = <A>(
|
export const fromSubscriptionRef = <A>(
|
||||||
ref: SubscriptionRef.SubscriptionRef<A>
|
ref: SubscriptionRef.SubscriptionRef<A>
|
||||||
): Lens<A, never, never, never, never> => make({
|
): Lens<A, never, never, never, never> => make({
|
||||||
get: ref.get,
|
get get() { return ref.get },
|
||||||
get changes() { return ref.changes },
|
get changes() { return ref.changes },
|
||||||
modify: ref.modifyEffect,
|
modify: ref.modifyEffect.bind(ref), // TODO
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@@ -106,6 +106,83 @@ export const mapEffect = <A, ER, RR, EW, RW, B, EGet = never, RGet = never, ESet
|
|||||||
)),
|
)),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
export const get = <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>): Effect.Effect<A, ER, RR> => self.get
|
||||||
|
|
||||||
|
export const set: {
|
||||||
|
<A, ER, RR, EW, RW>(value: A): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<void, ER | EW, RR | RW>
|
||||||
|
<A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, value: A): Effect.Effect<void, ER | EW, RR | RW>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, value: A) =>
|
||||||
|
self.modify<void, never, never>(() => Effect.succeed([void 0, value] as const)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const getAndSet: {
|
||||||
|
<A, ER, RR, EW, RW>(value: A): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
<A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, value: A): Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, value: A) =>
|
||||||
|
self.modify<A, never, never>(a => Effect.succeed([a, value] as const)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const update: {
|
||||||
|
<A, ER, RR, EW, RW>(f: (a: A) => A): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<void, ER | EW, RR | RW>
|
||||||
|
<A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => A): Effect.Effect<void, ER | EW, RR | RW>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => A) =>
|
||||||
|
self.modify<void, never, never>(a => Effect.succeed([void 0, f(a)] as const)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const updateEffect: {
|
||||||
|
<A, ER, RR, EW, RW, E, R>(f: (a: A) => Effect.Effect<A, E, R>): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<void, ER | EW | E, RR | RW | R>
|
||||||
|
<A, ER, RR, EW, RW, E, R>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<void, ER | EW | E, RR | RW | R>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW, E, R>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => Effect.Effect<A, E, R>) =>
|
||||||
|
self.modify<void, E, R>(a => Effect.flatMap(
|
||||||
|
f(a),
|
||||||
|
next => Effect.succeed([void 0, next] as const),
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const getAndUpdate: {
|
||||||
|
<A, ER, RR, EW, RW>(f: (a: A) => A): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
<A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => A): Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => A) =>
|
||||||
|
self.modify<A, never, never>(a => Effect.succeed([a, f(a)] as const)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const getAndUpdateEffect: {
|
||||||
|
<A, ER, RR, EW, RW, E, R>(f: (a: A) => Effect.Effect<A, E, R>): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<A, ER | EW | E, RR | RW | R>
|
||||||
|
<A, ER, RR, EW, RW, E, R>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<A, ER | EW | E, RR | RW | R>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW, E, R>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => Effect.Effect<A, E, R>) =>
|
||||||
|
self.modify<A, E, R>(a => Effect.flatMap(
|
||||||
|
f(a),
|
||||||
|
next => Effect.succeed([a, next] as const)
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const setAndGet: {
|
||||||
|
<A, ER, RR, EW, RW>(value: A): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
<A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, value: A): Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, value: A) =>
|
||||||
|
self.modify<A, never, never>(() => Effect.succeed([value, value] as const)),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const updateAndGet: {
|
||||||
|
<A, ER, RR, EW, RW>(f: (a: A) => A): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
<A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => A): Effect.Effect<A, ER | EW, RR | RW>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => A) =>
|
||||||
|
self.modify<A, never, never>(a => {
|
||||||
|
const next = f(a)
|
||||||
|
return Effect.succeed([next, next] as const)
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const updateAndGetEffect: {
|
||||||
|
<A, ER, RR, EW, RW, E, R>(f: (a: A) => Effect.Effect<A, E, R>): (self: Lens<A, ER, RR, EW, RW>) => Effect.Effect<A, ER | EW | E, RR | RW | R>
|
||||||
|
<A, ER, RR, EW, RW, E, R>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => Effect.Effect<A, E, R>): Effect.Effect<A, ER | EW | E, RR | RW | R>
|
||||||
|
} = Function.dual(2, <A, ER, RR, EW, RW, E, R>(self: Lens<A, ER, RR, EW, RW>, f: (a: A) => Effect.Effect<A, E, R>) =>
|
||||||
|
self.modify<A, E, R>(a => Effect.flatMap(
|
||||||
|
f(a),
|
||||||
|
next => Effect.succeed([next, next] as const),
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
export const unwrap = <A, ER, RR, EW, RW, E1, R1>(
|
export const unwrap = <A, ER, RR, EW, RW, E1, R1>(
|
||||||
effect: Effect.Effect<Lens<A, ER, RR, EW, RW>, E1, R1>
|
effect: Effect.Effect<Lens<A, ER, RR, EW, RW>, E1, R1>
|
||||||
): Lens<A, ER | E1, RR | R1, EW | E1, RW | R1> => make({
|
): Lens<A, ER | E1, RR | R1, EW | E1, RW | R1> => make({
|
||||||
@@ -122,10 +199,10 @@ Effect.gen(function*() {
|
|||||||
const myChunkLens = fromSubscriptionRef(myChunkRef)
|
const myChunkLens = fromSubscriptionRef(myChunkRef)
|
||||||
const chunkValueLens = mapEffect(myChunkLens, Chunk.get(1), (a, b) => Effect.succeed(Chunk.replace(a, 1, b)))
|
const chunkValueLens = mapEffect(myChunkLens, Chunk.get(1), (a, b) => Effect.succeed(Chunk.replace(a, 1, b)))
|
||||||
|
|
||||||
console.log(yield* myChunkRef.get)
|
console.log(yield* myChunkRef.get, yield* chunkValueLens.get)
|
||||||
console.log(yield* chunkValueLens.get)
|
// yield* update(myChunkLens, Chunk.replace(1, 22))
|
||||||
yield* Ref.update(myChunkRef, Chunk.replace(1, 22))
|
yield* set(chunkValueLens, 22)
|
||||||
console.log(yield* chunkValueLens.get)
|
console.log(yield* myChunkRef.get, yield* chunkValueLens.get)
|
||||||
}).pipe(
|
}).pipe(
|
||||||
Effect.runSync
|
Effect.runSync
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user