diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2020-07-15 17:48:52 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2020-07-15 18:12:28 +0200 |
| commit | 4509e845c9d05d66f68cb9d108aecd67db6c2b26 (patch) | |
| tree | 2af8bdc50515999966f935dc90d5b5a7994fcdcf | |
| parent | f9c7474c4c6271a7f11f4234349e2fb74dbed02c (diff) | |
| download | mullvadvpn-4509e845c9d05d66f68cb9d108aecd67db6c2b26.tar.xz mullvadvpn-4509e845c9d05d66f68cb9d108aecd67db6c2b26.zip | |
Remove unused Combine subclasses
| -rw-r--r-- | ios/MullvadVPN.xcodeproj/project.pbxproj | 22 | ||||
| -rw-r--r-- | ios/MullvadVPN/AutoDisposableSink.swift | 67 | ||||
| -rw-r--r-- | ios/MullvadVPN/CancellableDelayPublisher.swift | 32 | ||||
| -rw-r--r-- | ios/MullvadVPN/MutuallyExclusive.swift | 125 | ||||
| -rw-r--r-- | ios/MullvadVPN/ReplaceNilWithError.swift | 24 |
5 files changed, 0 insertions, 270 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 01c0f46d7f..7dfa57ccb2 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -42,8 +42,6 @@ 581CBCE62296B97300727D7F /* ViewControllerIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581CBCE52296B97300727D7F /* ViewControllerIdentifier.swift */; }; 581CBCEC2298041B00727D7F /* SettingsAppVersionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581CBCEB2298041B00727D7F /* SettingsAppVersionCell.swift */; }; 581CBCEE229826FD00727D7F /* StaticTableViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581CBCED229826FD00727D7F /* StaticTableViewDataSource.swift */; }; - 582650862384116F00FA7A86 /* ReplaceNilWithError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582650832384102800FA7A86 /* ReplaceNilWithError.swift */; }; - 582650872384117900FA7A86 /* ReplaceNilWithError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582650832384102800FA7A86 /* ReplaceNilWithError.swift */; }; 582AE3102440A6CA00E6733A /* AccountTokenInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582AE30F2440A6CA00E6733A /* AccountTokenInput.swift */; }; 582AE3122440CA0D00E6733A /* AccountTokenInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582AE3112440CA0D00E6733A /* AccountTokenInputTests.swift */; }; 582AE3132440CA2700E6733A /* AccountTokenInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582AE30F2440A6CA00E6733A /* AccountTokenInput.swift */; }; @@ -57,11 +55,8 @@ 5840250422B11AB700E4CFEC /* MullvadEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5840250322B11AB700E4CFEC /* MullvadEndpoint.swift */; }; 5840250522B11AB700E4CFEC /* MullvadEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5840250322B11AB700E4CFEC /* MullvadEndpoint.swift */; }; 5845F838236C466400B2D93C /* TunnelControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5845F837236C466400B2D93C /* TunnelControlViewController.swift */; }; - 5845F83A236C6A7200B2D93C /* AutoDisposableSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5845F839236C6A7200B2D93C /* AutoDisposableSink.swift */; }; - 5845F83C236C72E300B2D93C /* AutoDisposableSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5845F839236C6A7200B2D93C /* AutoDisposableSink.swift */; }; 5845F842236CBACD00B2D93C /* PacketTunnelIpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5845F841236CBACD00B2D93C /* PacketTunnelIpc.swift */; }; 5845F843236CBDAB00B2D93C /* PacketTunnelIpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5845F841236CBACD00B2D93C /* PacketTunnelIpc.swift */; }; - 584E96BA240D791E00D3334F /* CancellableDelayPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E96B9240D791E00D3334F /* CancellableDelayPublisher.swift */; }; 584E96BC240FD4DA00D3334F /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A1AA8623F43901009F7EA6 /* Location.swift */; }; 584E96BD240FD4DA00D3334F /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A1AA8623F43901009F7EA6 /* Location.swift */; }; 584E96BE240FD4DB00D3334F /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A1AA8623F43901009F7EA6 /* Location.swift */; }; @@ -94,8 +89,6 @@ 5888AD83227B11080051EB06 /* SelectLocationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5888AD82227B11080051EB06 /* SelectLocationCell.swift */; }; 5888AD87227B17950051EB06 /* SelectLocationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5888AD86227B17950051EB06 /* SelectLocationController.swift */; }; 5888AD89227B18C40051EB06 /* RelayList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5888AD88227B18C40051EB06 /* RelayList.swift */; }; - 588AE72F2362001F009F9F2E /* MutuallyExclusive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588AE72E2362001F009F9F2E /* MutuallyExclusive.swift */; }; - 588AE730236200E2009F9F2E /* MutuallyExclusive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588AE72E2362001F009F9F2E /* MutuallyExclusive.swift */; }; 588D2FE3248AC27F00E313F7 /* AsyncOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E973DD24850EB600096F90 /* AsyncOperation.swift */; }; 58906DE02445C7A5002F0673 /* NEProviderStopReason+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */; }; 5896AE7E246ACE65005B36CB /* KeychainAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FAEDEB245059F000CB0F5B /* KeychainAttributes.swift */; }; @@ -257,7 +250,6 @@ 581CBCE52296B97300727D7F /* ViewControllerIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerIdentifier.swift; sourceTree = "<group>"; }; 581CBCEB2298041B00727D7F /* SettingsAppVersionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsAppVersionCell.swift; sourceTree = "<group>"; }; 581CBCED229826FD00727D7F /* StaticTableViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaticTableViewDataSource.swift; sourceTree = "<group>"; }; - 582650832384102800FA7A86 /* ReplaceNilWithError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplaceNilWithError.swift; sourceTree = "<group>"; }; 582AE30F2440A6CA00E6733A /* AccountTokenInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountTokenInput.swift; sourceTree = "<group>"; }; 582AE3112440CA0D00E6733A /* AccountTokenInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTokenInputTests.swift; sourceTree = "<group>"; }; 582BB1AE229566420055B6EF /* SettingsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsCell.swift; sourceTree = "<group>"; }; @@ -268,10 +260,8 @@ 5840250022B1124600E4CFEC /* IpAddress+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IpAddress+Codable.swift"; sourceTree = "<group>"; }; 5840250322B11AB700E4CFEC /* MullvadEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MullvadEndpoint.swift; sourceTree = "<group>"; }; 5845F837236C466400B2D93C /* TunnelControlViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelControlViewController.swift; sourceTree = "<group>"; }; - 5845F839236C6A7200B2D93C /* AutoDisposableSink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoDisposableSink.swift; sourceTree = "<group>"; }; 5845F841236CBACD00B2D93C /* PacketTunnelIpc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelIpc.swift; sourceTree = "<group>"; }; 584B26F3237434D00073B10E /* RelaySelectorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelaySelectorTests.swift; sourceTree = "<group>"; }; - 584E96B9240D791E00D3334F /* CancellableDelayPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancellableDelayPublisher.swift; sourceTree = "<group>"; }; 58561C98239A5D1500BD6B5E /* IPEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPEndpoint.swift; sourceTree = "<group>"; }; 5860F1C123A785C600CEA666 /* WireguardDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireguardDevice.swift; sourceTree = "<group>"; }; 5860F1C323A8D25F00CEA666 /* WireguardConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireguardConfiguration.swift; sourceTree = "<group>"; }; @@ -297,7 +287,6 @@ 5888AD82227B11080051EB06 /* SelectLocationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocationCell.swift; sourceTree = "<group>"; }; 5888AD86227B17950051EB06 /* SelectLocationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectLocationController.swift; sourceTree = "<group>"; }; 5888AD88227B18C40051EB06 /* RelayList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayList.swift; sourceTree = "<group>"; }; - 588AE72E2362001F009F9F2E /* MutuallyExclusive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MutuallyExclusive.swift; sourceTree = "<group>"; }; 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NEProviderStopReason+Debug.swift"; sourceTree = "<group>"; }; 5894E725236B2801008A2793 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 5896AE83246D5889005B36CB /* CustomDateComponentsFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDateComponentsFormatting.swift; sourceTree = "<group>"; }; @@ -496,11 +485,9 @@ 58DF28A42417CB4B00E836B0 /* AppStorePaymentManager.swift */, 58FD5BE624192A2B00112C88 /* AppStoreReceipt.swift */, 58CE5E6A224146210008646E /* Assets.xcassets */, - 5845F839236C6A7200B2D93C /* AutoDisposableSink.swift */, 588534BD246193C00018B744 /* AutomaticKeyRotationManager.swift */, 589AB4F6227B64450039131E /* BasicTableViewCell.swift */, 58EC4E6B23915325003F5C5B /* Bundle+MullvadVersion.swift */, - 584E96B9240D791E00D3334F /* CancellableDelayPublisher.swift */, 58F840B12464491D0044E708 /* ChainedError.swift */, 58A1AA8B23F5584B009F7EA6 /* ConnectionPanelView.swift */, 58CCA00F224249A1004F3011 /* ConnectViewController.swift */, @@ -534,7 +521,6 @@ 58ADDB3D227B1CD900FAFEA7 /* MullvadRpc.swift */, 58FBDAAA22A52DC500EB69A3 /* MullvadVPN-Bridging-Header.h */, 5866F39B2243B82D00168AE5 /* MullvadVPN.entitlements */, - 588AE72E2362001F009F9F2E /* MutuallyExclusive.swift */, 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */, 5811DE4F239014550011EB53 /* NEVPNStatus+Debug.swift */, 58CC40EE24A601900019D96E /* ObserverList.swift */, @@ -546,7 +532,6 @@ 5888AD88227B18C40051EB06 /* RelayList.swift */, 58781CD422AFBA39009B9D8E /* RelaySelector.swift */, 5888AD7E2279B6BF0051EB06 /* RelayStatusIndicatorView.swift */, - 582650832384102800FA7A86 /* ReplaceNilWithError.swift */, 587425C02299833500CA2045 /* RootContainerViewController.swift */, 5867A51B2248F26A005513C0 /* SegueIdentifier.swift */, 5888AD82227B11080051EB06 /* SelectLocationCell.swift */, @@ -925,7 +910,6 @@ 5888AD87227B17950051EB06 /* SelectLocationController.swift in Sources */, 580EE20424B321EC00F9D8A1 /* OperationObserver.swift in Sources */, 58F19E35228C15BA00C7710B /* SpinnerActivityIndicatorView.swift in Sources */, - 584E96BA240D791E00D3334F /* CancellableDelayPublisher.swift in Sources */, 58A99ED3240014A0006599E9 /* ConsentViewController.swift in Sources */, 58FAEE0124533A9C00CB0F5B /* KeychainClass.swift in Sources */, 5845F838236C466400B2D93C /* TunnelControlViewController.swift in Sources */, @@ -934,7 +918,6 @@ 587CBFE322807F530028DED3 /* UIColor+Helpers.swift in Sources */, 581CBCEC2298041B00727D7F /* SettingsAppVersionCell.swift in Sources */, 58FAEDFD24533A5500CB0F5B /* KeychainMatchLimit.swift in Sources */, - 5845F83A236C6A7200B2D93C /* AutoDisposableSink.swift in Sources */, 5840250422B11AB700E4CFEC /* MullvadEndpoint.swift in Sources */, 58CC40EF24A601900019D96E /* ObserverList.swift in Sources */, 58CCA01822426713004F3011 /* AccountViewController.swift in Sources */, @@ -952,7 +935,6 @@ 580EE22124B3240100F9D8A1 /* TransformOperationObserver.swift in Sources */, 582BB1AF229566420055B6EF /* SettingsCell.swift in Sources */, 5873884D239E6D7E00E96C4E /* EmbeddedViewContainerView.swift in Sources */, - 582650862384116F00FA7A86 /* ReplaceNilWithError.swift in Sources */, 58F3C0A4249CB069003E76BE /* HeaderBarView.swift in Sources */, 58B9EB132488ED2100095626 /* AlertPresenter.swift in Sources */, 587A01FC23F1F0BE00B68763 /* SimulatorTunnelProviderHost.swift in Sources */, @@ -984,7 +966,6 @@ 587425C12299833500CA2045 /* RootContainerViewController.swift in Sources */, 580EE20124B321D500F9D8A1 /* OperationProtocol.swift in Sources */, 5896AE84246D5889005B36CB /* CustomDateComponentsFormatting.swift in Sources */, - 588AE72F2362001F009F9F2E /* MutuallyExclusive.swift in Sources */, 5888AD89227B18C40051EB06 /* RelayList.swift in Sources */, 580EE21824B3235100F9D8A1 /* AnyOperationObserver.swift in Sources */, 587AD7C623421D7000E93A53 /* TunnelSettings.swift in Sources */, @@ -1003,7 +984,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5845F83C236C72E300B2D93C /* AutoDisposableSink.swift in Sources */, 5860F1C423A8D25F00CEA666 /* WireguardConfiguration.swift in Sources */, 58F3C09D249B99DD003E76BE /* Curve25519.swift in Sources */, 580EE21F24B3237F00F9D8A1 /* OutputOperation.swift in Sources */, @@ -1012,7 +992,6 @@ 58FAEE0324533ABE00CB0F5B /* KeychainReturn.swift in Sources */, 58BFA5CD22A7CE1F00A6173D /* ApplicationConfiguration.swift in Sources */, 58BFA5C222A7C92900A6173D /* JsonRpc.swift in Sources */, - 588AE730236200E2009F9F2E /* MutuallyExclusive.swift in Sources */, 580EE20724B3222400F9D8A1 /* ExclusivityController.swift in Sources */, 58F840B02464382C0044E708 /* KeychainItemRevision.swift in Sources */, 58C6B35122BB7CFD003C19AD /* IPAddressRange.swift in Sources */, @@ -1041,7 +1020,6 @@ 58AEEF6C2344A49D00C9BBD5 /* TunnelSettingsManager.swift in Sources */, 58C6B35F22BBBFE3003C19AD /* Data+HexCoding.swift in Sources */, 5840250522B11AB700E4CFEC /* MullvadEndpoint.swift in Sources */, - 582650872384117900FA7A86 /* ReplaceNilWithError.swift in Sources */, 58BFA5C722A7C97F00A6173D /* RelayCache.swift in Sources */, 58BFA5C022A7C8A900A6173D /* MullvadRpc.swift in Sources */, 580EE21024B322E700F9D8A1 /* TransformOperation.swift in Sources */, diff --git a/ios/MullvadVPN/AutoDisposableSink.swift b/ios/MullvadVPN/AutoDisposableSink.swift deleted file mode 100644 index 548e343053..0000000000 --- a/ios/MullvadVPN/AutoDisposableSink.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// AutoDisposableSink.swift -// MullvadVPN -// -// Created by pronebird on 01/11/2019. -// Copyright © 2019 Mullvad VPN AB. All rights reserved. -// - -import Combine -import Foundation - -/// A thread safe storage for a set of `AnyCancellable` objects -final class CancellableSet { - private let lock = NSLock() - private var storage = Set<AnyCancellable>() - - func append(_ cancellable: AnyCancellable) { - lock.lock() - storage.insert(cancellable) - lock.unlock() - } - - func remove(_ cancellable: AnyCancellable) { - lock.lock() - storage.remove(cancellable) - lock.unlock() - } -} - -extension Publisher { - - /// Make a `Publishers.Sink` subscriber and put it in the given `CancellableSet`, automatically - /// remove it upon completion. - func autoDisposableSink(cancellableSet: CancellableSet, receiveCompletion: @escaping ((Subscribers.Completion<Self.Failure>) -> Void), receiveValue: @escaping ((Self.Output) -> Void)) -> Void { - var sharedCancellable: AnyCancellable? - - let disposeSubscriber = { - if let sharedCancellable = sharedCancellable { - cancellableSet.remove(sharedCancellable) - } - } - - let cancellable = handleEvents(receiveCancel: { - disposeSubscriber() - }).sink(receiveCompletion: { (completion) in - receiveCompletion(completion) - - disposeSubscriber() - }, receiveValue: receiveValue) - - sharedCancellable = cancellable - cancellableSet.append(cancellable) - } - -} - -extension Publisher where Output == Void, Failure: Error { - - func sink(receiveCompletion: @escaping ((Subscribers.Completion<Failure>) -> Void)) -> AnyCancellable { - return sink(receiveCompletion: receiveCompletion, receiveValue: { _ in }) - } - - func autoDisposableSink(cancellableSet: CancellableSet, receiveCompletion: @escaping ((Subscribers.Completion<Failure>) -> Void)) -> Void { - return autoDisposableSink(cancellableSet: cancellableSet, receiveCompletion: receiveCompletion, receiveValue: { _ in }) - } - -} diff --git a/ios/MullvadVPN/CancellableDelayPublisher.swift b/ios/MullvadVPN/CancellableDelayPublisher.swift deleted file mode 100644 index c177bd4251..0000000000 --- a/ios/MullvadVPN/CancellableDelayPublisher.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// CancellableDelayPublisher.swift -// MullvadVPN -// -// Created by pronebird on 02/03/2020. -// Copyright © 2020 Mullvad VPN AB. All rights reserved. -// - -import Foundation -import Combine - -extension Publisher { - - /// This is a `delay` operator implementation that respects cancellation - func cancellableDelay<S>(for delay: S.SchedulerTimeType.Stride, scheduler: S) - -> Publishers.FlatMap<PassthroughSubject<Self.Output, Self.Failure>, Self> - where S: Scheduler - { - return self.flatMap { (value) -> PassthroughSubject<Output, Failure> in - let subject = PassthroughSubject<Output, Failure>() - let date = scheduler.now.advanced(by: delay) - - // `PassthroughSubject` does not emit values, nor completion after cancellation - scheduler.schedule(after: date) { - subject.send(value) - subject.send(completion: .finished) - } - - return subject - } - } -} diff --git a/ios/MullvadVPN/MutuallyExclusive.swift b/ios/MullvadVPN/MutuallyExclusive.swift deleted file mode 100644 index fc0bd254c5..0000000000 --- a/ios/MullvadVPN/MutuallyExclusive.swift +++ /dev/null @@ -1,125 +0,0 @@ -// -// MutuallyExclusive.swift -// MullvadVPN -// -// Created by pronebird on 24/10/2019. -// Copyright © 2019 Mullvad VPN AB. All rights reserved. -// - -import Combine -import Foundation - -extension Publishers { - - /// A publisher that blocks the given DispatchQueue until the produced publisher reported the - /// completion. - final class MutuallyExclusive<PublisherType, Context>: Publisher - where - PublisherType: Publisher, - Context: Scheduler - { - typealias MakePublisherBlock = () -> PublisherType - - typealias Output = PublisherType.Output - typealias Failure = PublisherType.Failure - - private let exclusivityQueue: Context - private let executionQueue: Context - - private let createPublisher: MakePublisherBlock - - init(exclusivityQueue: Context, executionQueue: Context, createPublisher: @escaping MakePublisherBlock) { - self.exclusivityQueue = exclusivityQueue - self.executionQueue = executionQueue - self.createPublisher = createPublisher - } - - func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Failure, S.Input == Output { - let subscription = MutuallyExclusive.Subscription( - subscriber: subscriber, - createPublisher: createPublisher, - exclusivityQueue: exclusivityQueue, - executionQueue: executionQueue) - - subscriber.receive(subscription: subscription) - } - } -} - -private extension Publishers.MutuallyExclusive { - - /// A subscription used by `MutuallyExclusive` publisher - final class Subscription<SubscriberType, PublisherType, Context>: Combine.Subscription - where - SubscriberType: Subscriber, PublisherType: Publisher, - PublisherType.Output == SubscriberType.Input, - PublisherType.Failure == SubscriberType.Failure, - Context: Scheduler - { - typealias MakePublisherBlock = () -> PublisherType - - private let subscriber: SubscriberType - private var innerSubscriber: AnyCancellable? - private let createPublisher: MakePublisherBlock - - private let exclusivityQueue: Context - private let executionQueue: Context - private let sema = DispatchSemaphore(value: 0) - - private let cancelLock = NSLock() - private var isCancelled = false - - init(subscriber: SubscriberType, - createPublisher: @escaping MakePublisherBlock, - exclusivityQueue: Context, - executionQueue: Context) - { - self.subscriber = subscriber - self.createPublisher = createPublisher - self.exclusivityQueue = exclusivityQueue - self.executionQueue = executionQueue - } - - func request(_ demand: Subscribers.Demand) { - self.exclusivityQueue.schedule { - self.executionQueue.schedule { - self.cancelLock.withCriticalBlock { - guard !self.isCancelled else { return } - - self.innerSubscriber = self.createPublisher() - .sink(receiveCompletion: { [weak self] (completion) in - guard let self = self else { return } - - self.subscriber.receive(completion: completion) - self.signalSemaphore() - }, receiveValue: { [weak self] (output) in - _ = self?.subscriber.receive(output) - }) - } - } - self.sema.wait() - } - } - - func cancel() { - cancelLock.withCriticalBlock { - guard !isCancelled else { return } - - isCancelled = true - - innerSubscriber?.cancel() - innerSubscriber = nil - - signalSemaphore() - } - } - - private func signalSemaphore() { - _ = sema.signal() - } - - } - -} - -typealias MutuallyExclusive = Publishers.MutuallyExclusive diff --git a/ios/MullvadVPN/ReplaceNilWithError.swift b/ios/MullvadVPN/ReplaceNilWithError.swift deleted file mode 100644 index f25a8ff7bc..0000000000 --- a/ios/MullvadVPN/ReplaceNilWithError.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// ReplaceNilWithError.swift -// MullvadVPN -// -// Created by pronebird on 19/11/2019. -// Copyright © 2019 Mullvad VPN AB. All rights reserved. -// - -import Combine -import Foundation - -extension Publisher { - - /// Replace nil elements with the provided error - func replaceNil<T>(with error: Failure) -> Publishers.FlatMap<Result<T, Failure>.Publisher, Self> - where Output == T?, Failure: Error { - return flatMap { (output: T?) -> Result<T, Failure>.Publisher in - let result: Result<T, Failure> = output.flatMap { .success($0) } ?? .failure(error) - - return result.publisher - } - } - -} |
