> https://github.com/apple/swift-evolution/blob/master/proposals/0109-remove-boolean.md

>       • What is your evaluation of the proposal?

+1. I hope we eventually get this functionality back through a more flexible 
mechanism—either subtyping Bool or a protocol for creating custom conditional 
constructs[1]—but I don't think `Boolean` is really carrying its weight at this 
point.

>       • Is the problem being addressed significant enough to warrant a change 
> to Swift?

Yes. We're trying to get rid of this kind of thing now.

>       • Does this proposal fit well with the feel and direction of Swift?

See previous.

>       • If you have used other languages or libraries with a similar feature, 
> how do you feel that this proposal compares to those?

The only language I've used 

>       • How much effort did you put into your review? A glance, a quick 
> reading, or an in-depth study?

Quick reading.



[1] For instance, if we have a pattern matching protocol like this:

        // Allows for `if case .foo(let bar, let baz) = quux`-style pattern 
matching.
        protocol PatternProtocol {
                associatedtype Value
                associatedtype Destructured = Void
                
                // Returns nil for a failed match, or the destructured values 
for a 
                // successful match.
                func match(for value: Value) -> Destructured?
                
                // One could also imagine a `func init(values...: Destructured) 
-> Value` here
        }
        
        // Enum cases would have a pattern as one of their "aspects", as though 
        // they had things like:
        extension Optional {
                static let none: Pattern.None
                static let some: Pattern.Some
                
                enum Pattern {
                        struct None: PatternProtocol {
                                typealias Value = Optional<Wrapped>
                                func match(for value: Value) -> Void? { … }
                        }
                        struct Some: PatternProtocol {
                                typealias Value = Optional<Wrapped>
                                typealias Destructured = Wrapped
                                func match(for value: Value) -> Void? { … }
                        }
                }       
        }
        
        // You could write your own patterns for other types:
        extension URL {
                static let http = SchemePattern(scheme: "http")
                static let https = SchemePattern(scheme: "https")
                static let mailto = SchemePattern(scheme: "mailto")
                
                struct SchemePattern: PatternProtocol {
                        associatedtype Value = URL
                        associatedtype Destructured = (host: String, path: 
String)
                        
                        var scheme: String
                        
                        func match(for value: Value) -> Destructured? {
                                guard value.scheme == scheme else { return nil }
                                return (value.host, value.path)
                        }
                }
        }

Then we could offer a `ConditionalConvertible` protocol which would open up `if 
let` and plain `if` to other types:
        
        // Allows for `if let (bar, baz) = quux` and, if UnwrappedValues is 
Void, `if quux`.
        protocol ConditionalConvertible {
                associatedtype Conditional: PatternProtocol where 
ConditionalPattern.Value == Self
                static var conditional: Conditional
        }
        
        extension Optional: ConditionalConvertible {
                typealias Conditional = Pattern.Some
                static let conditional = some
        }
        
        extension Bool: ConditionalConvertible {
                struct Conditional: PatternProtocol {
                        typealias Value = Bool
                        
                        func match(for value: Value) -> Void? {
                                // equivalent to...
                                return value ? () : nil
                        }
                }
                static let conditional = Conditional()
        }

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to