@propertyWrapper
final class ThreadSafe<T> {
    private let queue = DispatchQueue(label: "ThreadSafeTypeQueue",
                                      attributes: .concurrent)

    private var content: T

    var wrappedValue: T {
        get {
            queue.sync {
                content
            }
        }

        set {
            queue.async(flags: .barrier) { [weak self] in
                guard let self = self else { return }
                self.content = newValue
            }
        }
    }

    init(wrappedValue: T) {
        self.content = wrappedValue
    }
}