>> Just mentioning it as to end up... with the proper name for this new 
>> function.
> 
> Naming can always be bikeshedded. 

One possibility is to split `with` in two:

- A plain `with` whose closure parameter is not mutable and which is marked 
`@discardableResult`.

- A `withVar` whose parameter *is* mutable and which is *not* marked 
`@discardableResult`. (This would help with the fact that our use of 
`@discardableResult` is a little dangerous, in that people might expect 
mutations to affect the original variable even if it's a value type.)

`withVar` does, I think, make it pretty clear that you're working with a copy 
of the variable.

        /// Returns `item` after calling `use` to inspect it.
        /// 
        /// If `T` is a value type, `use` is unable to mutate `item`.
        /// If `T` is a reference type, `use` may use members which 
        /// change `item`, but cannot assign a different instance.
        @discardableResult
        public func with<T>(_ item: T, use: @noescape (T) throws -> Void) 
rethrows -> T {
          try use(item)
          return item
        }
        
        /// Returns `item` after calling `update` to inspect and possibly 
        /// modify it.
        /// 
        /// If `T` is a value type, `update` uses an independent copy 
        /// of `item`. If `T` is a reference type, `update` uses the 
        /// same instance passed in, but it can substitute a different 
        /// instance by setting its parameter to a new value.
        public func withVar<T>(_ item: T, update: @noescape (inout T) throws -> 
Void) rethrows -> T {
          var this = item
          try update(&this)
          return this
        }

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to