Quick tuple in where where

I have a general class:

class Generic<T> {
    var value: T

    init(value: T) {
        self.value = value
    }
}

And I want to write an extension method that is used only if it Tis a tuple of two values ​​of any type, and this method returns a type value Genericwith a new tuple of 3 values. I tried:

extension Generic {
    func append<A, B, C where T: (A, B)>(c: C) -> Generic<(A, B, C)> {
        return Generic(value: (value.0, value.1, c))
    }
}

But obviously this does not work, because the proposal whereonly accepts protocols.

+4
source share
1 answer

The only way I found to implement it:

class Generic<T> {
    var value: T

    init(value: T) {
        self.value = value
    }
}

protocol Tuple2 {
    typealias A
    typealias B
    var i0: A { get }
    var i1: B { get }
}

protocol Tuple3: Tuple2 {
    typealias C
    var i2: C { get }
}

struct Tuple2Impl<A, B>: Tuple2 {
    var i0: A
    var i1: B

    init(_ i0: A, _ i1: B) {
        self.i0 = i0
        self.i1 = i1
    }
}
struct Tuple3Impl<A, B, C>: Tuple3 {
    var i0: A
    var i1: B
    var i2: C

    init(_ i0: A, _ i1: B, _ i2: C) {
        self.i0 = i0
        self.i1 = i1
        self.i2 = i2
    }
}

extension Generic where T: Tuple2 {
    func append<C>(c: C) -> Generic<Tuple3Impl<T.A, T.B, C>> {
        return Generic<Tuple3Impl<T.A, T.B, C>>(value: Tuple3Impl(value.i0, value.i1, c))
    }
}

var a = Generic(value: Tuple2Impl("Hello", 256))

print(a.append(3.14).value.i2)
0
source

Source: https://habr.com/ru/post/1608649/


All Articles