Peter 971273e8f8 Add 'submodules/SSignalKit/' from commit '359b2ee7c9f20f99f221f78e307369ef5ad0ece2'
git-subtree-dir: submodules/SSignalKit
git-subtree-mainline: 4459dc5b47e7db4ea1adb3a43a4324d1c2f9feab
git-subtree-split: 359b2ee7c9f20f99f221f78e307369ef5ad0ece2
2019-06-11 18:57:57 +01:00

54 lines
1.5 KiB
Swift

import Foundation
public final class QueueLocalObject<T: AnyObject> {
private let queue: Queue
private var valueRef: Unmanaged<T>?
public init(queue: Queue, generate: @escaping () -> T) {
self.queue = queue
self.queue.async {
let value = generate()
self.valueRef = Unmanaged.passRetained(value)
}
}
deinit {
let valueRef = self.valueRef
self.queue.async {
valueRef?.release()
}
}
public func with(_ f: @escaping (T) -> Void) {
self.queue.async {
if let valueRef = self.valueRef {
let value = valueRef.takeUnretainedValue()
f(value)
}
}
}
public func syncWith<R>(_ f: @escaping (T) -> R) -> R? {
var result: R?
self.queue.sync {
if let valueRef = self.valueRef {
let value = valueRef.takeUnretainedValue()
result = f(value)
}
}
return result
}
public func signalWith<R, E>(_ f: @escaping (T, Subscriber<R, E>) -> Disposable) -> Signal<R, E> {
return Signal { [weak self] subscriber in
if let strongSelf = self, let valueRef = strongSelf.valueRef {
let value = valueRef.takeUnretainedValue()
return f(value, subscriber)
} else {
return EmptyDisposable
}
} |> runOn(self.queue)
}
}