// // Locked.swift // LoopKit // // Copyright © 2018 LoopKit Authors. All rights reserved. // import os.lock internal class Locked { private var lock = os_unfair_lock() private var _value: T init(_ value: T) { os_unfair_lock_lock(&lock) defer { os_unfair_lock_unlock(&lock) } _value = value } var value: T { get { os_unfair_lock_lock(&lock) defer { os_unfair_lock_unlock(&lock) } return _value } set { os_unfair_lock_lock(&lock) defer { os_unfair_lock_unlock(&lock) } _value = newValue } } @discardableResult func mutate(_ changes: (_ value: inout T) -> Void) -> T { os_unfair_lock_lock(&lock) defer { os_unfair_lock_unlock(&lock) } changes(&_value) return _value } }