Locked.swift 687 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. //
  2. // Locked.swift
  3. // LoopKit
  4. //
  5. // Copyright © 2018 LoopKit Authors. All rights reserved.
  6. //
  7. import os.lock
  8. public class Locked<T> {
  9. private var _lock: UnfairLock
  10. private var _value: T
  11. public init(_ value: T) {
  12. _lock = UnfairLock()
  13. _value = value
  14. }
  15. public var value: T {
  16. get {
  17. return _lock.withLock { _value }
  18. }
  19. set {
  20. _lock.withLock {
  21. _value = newValue
  22. }
  23. }
  24. }
  25. @discardableResult public func mutate(_ changes: (_ value: inout T) -> Void) -> T {
  26. return _lock.withLock {
  27. changes(&_value)
  28. return _value
  29. }
  30. }
  31. }