devxoul / Then

✨ Super sweet syntactic sugar for Swift initializers
MIT License
4.16k stars 290 forks source link

[proposal] Mutating a value type #88

Open dtrofimov opened 3 years ago

dtrofimov commented 3 years ago

Motivation

To mutate some deeply nested value types, we have to write the whole key path at least twice:

some.very[deep].structure.someProperty = someValue
some.very[deep].structure.anotherProperty = anotherValue

// or with Then:

some.very[deep].structure = some.very[deep].structure.with {
    $0.someProperty = someValue
    $0.anotherProperty = anotherValue
}

Solution

Let's extend Then with mutate function (alternatives: update, access, write):

extension Then {
    public mutating func mutate(_ block: (inout Self) throws -> Void) rethrows {
        try block(&self)
    }
}

Usage:

some.very[deep].structure.mutate {
    $0.someProperty = someValue
    $0.anotherProperty = anotherValue
}

It would be great to have this in Then library. Thank you!

tanpengsccd commented 2 years ago

Hope to be a PR.