import { identity } from "@effect-ts-app/core/Function" export function setIfDefined_(lens: Lens) { return (b: B | undefined, map: (b: B) => A) => b !== undefined ? lens.set(map(b)) : identity } export function setIfDefined(lens: Lens) { return (map: (b: B) => A) => (b: B | undefined) => setIfDefined_(lens)(b, map) } export function modifyM_( l: Lens, mod: (b: B) => Effect ) { return (a: A) => modifyM__(l, a, mod) } export function modifyM__( l: Lens, a: A, mod: (b: B) => Effect ) { return Effect.gen(function*($) { const b = yield* $(mod(l.get(a))) return l.set(b)(a) }) } export function modify__(l: Lens, a: A, mod: (b: B) => B) { return l.set(mod(l.get(a)))(a) } export function modifyConcat(l: Lens, a: A) { return (v: readonly B[]) => modifyConcat_(l, a, v) } export function modifyConcat_( l: Lens, a: A, v: readonly B[] ) { return modify__(l, a, b => b.concat(v)) } export function modifyM(l: Lens) { return (mod: (b: B) => Effect) => modifyM_(l, mod) } export function modify2M_( l: Lens, mod: (b: B) => Effect ) { return (a: A) => modify2M__(l, a, mod) } export function modify2M__( l: Lens, a: A, mod: (b: B) => Effect ) { return Effect.gen(function*($) { const [b, evt] = yield* $(mod(l.get(a))) return [l.set(b)(a), evt] as const }) } export function modify2M(l: Lens) { return (mod: (b: B) => Effect) => modify2M_(l, mod) } export function modify2_( l: Lens, mod: (b: B) => readonly [B, EVT] ) { return (a: A) => modify2__(l, a, mod) } export function modify2__( l: Lens, a: A, mod: (b: B) => readonly [B, EVT] ) { const [b, evt] = mod(l.get(a)) return [l.set(b)(a), evt] as const } export function modify2(l: Lens) { return (mod: (b: B) => readonly [B, EVT]) => modify2_(l, mod) }