// // Copyright (c) 2020-2021 MobileCoin. All rights reserved. // import Foundation class ArbitraryConnection { private let inner: SerialDispatchLock private let connectionOptionWrapperFactory: (TransportProtocol.Option) -> ConnectionOptionWrapper init( connectionOptionWrapperFactory: @escaping (TransportProtocol.Option) -> ConnectionOptionWrapper, transportProtocolOption: TransportProtocol.Option, targetQueue: DispatchQueue? ) { self.connectionOptionWrapperFactory = connectionOptionWrapperFactory let connectionOptionWrapper = connectionOptionWrapperFactory(transportProtocolOption) let inner = Inner(connectionOptionWrapper: connectionOptionWrapper) self.inner = .init(inner, targetQueue: targetQueue) } func setTransportProtocolOption(_ transportProtocolOption: TransportProtocol.Option) { let connectionOptionWrapper = connectionOptionWrapperFactory(transportProtocolOption) inner.accessAsync { $0.connectionOptionWrapper = connectionOptionWrapper } } var connectionOptionWrapper: ConnectionOptionWrapper { inner.accessWithoutLocking.connectionOptionWrapper } } extension ArbitraryConnection { private struct Inner { var connectionOptionWrapper: ConnectionOptionWrapper init(connectionOptionWrapper: ConnectionOptionWrapper) { self.connectionOptionWrapper = connectionOptionWrapper } } }