CommandLineToolkit
49 строк · 1.0 Кб
1import Dispatch
2import Foundation
3
4@propertyWrapper
5public final class AtomicValue<T> {
6private var value: T
7private let lock = NSRecursiveLock()
8
9public init(_ value: T) {
10self.value = value
11}
12
13public init(wrappedValue: T) {
14self.value = wrappedValue
15}
16
17public var wrappedValue: T {
18get { currentValue() }
19set { set(newValue) }
20_modify {
21lock.lock()
22defer { lock.unlock() }
23yield &value
24}
25}
26
27public var projectedValue: AtomicValue {
28return self
29}
30
31@discardableResult
32public func withExclusiveAccess<R>(work: (inout T) throws -> R) rethrows -> R {
33lock.lock()
34defer { lock.unlock() }
35return try work(&value)
36}
37
38public func currentValue() -> T {
39lock.lock()
40defer { lock.unlock() }
41return value
42}
43
44public func set(_ newValue: T) {
45lock.lock()
46defer { lock.unlock() }
47value = newValue
48}
49}
50