diff --git a/CHANGELOG.md b/CHANGELOG.md index b840b63d8..d0b10394c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # master *Please add new entries at the top.* +1. Add `_modify` accessor to `Atomic.value` (#731, kudos to @p4checo) # 6.0.0 1. Dropped support for Swift 4.2 (Xcode 9) diff --git a/Sources/Atomic.swift b/Sources/Atomic.swift index de92d8e2f..78a67e48f 100644 --- a/Sources/Atomic.swift +++ b/Sources/Atomic.swift @@ -226,6 +226,13 @@ public final class Atomic { set(newValue) { swap(newValue) } + + _modify { + lock.lock() + defer { lock.unlock() } + + yield &_value + } } /// Initialize the variable with the given initial value. diff --git a/Tests/ReactiveSwiftTests/AtomicSpec.swift b/Tests/ReactiveSwiftTests/AtomicSpec.swift index 8234f5b9f..27f4316f9 100644 --- a/Tests/ReactiveSwiftTests/AtomicSpec.swift +++ b/Tests/ReactiveSwiftTests/AtomicSpec.swift @@ -18,11 +18,14 @@ class AtomicSpec: QuickSpec { atomic = Atomic(1) } - it("should read and write the value directly") { + it("should read, write and modify the value directly") { expect(atomic.value) == 1 atomic.value = 2 expect(atomic.value) == 2 + + atomic.value += 1 + expect(atomic.value) == 3 } it("should swap the value atomically") {