From 9f75d613c50658e49651053bc18d61ea9d6b4043 Mon Sep 17 00:00:00 2001 From: dankinsoid <30962149+dankinsoid@users.noreply.github.com> Date: Tue, 12 Mar 2024 01:11:39 +0300 Subject: [PATCH] 0.19.0 --- .../UserInterfaceState.xcuserstate | Bin 104060 -> 104632 bytes README.md | 14 ++- Sources/VDStore/Store.swift | 84 ++++++++++---- Sources/VDStore/StoreExtensions/Iflet.swift | 48 ++++++++ Sources/VDStore/Utils/StoreBox.swift | 108 +++++++++++------- Tests/VDStoreTests/VDStoreTests.swift | 33 +++++- 6 files changed, 219 insertions(+), 68 deletions(-) create mode 100644 Sources/VDStore/StoreExtensions/Iflet.swift diff --git a/Examples/Search/Search.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate b/Examples/Search/Search.xcodeproj/project.xcworkspace/xcuserdata/danil.xcuserdatad/UserInterfaceState.xcuserstate index 1f0ca1a47e4c247fb67ea0ed9921359e4c869879..fc9b4e71b8b04d528b909f0ed8fdce97332896c4 100644 GIT binary patch literal 104632 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 VpE>{iXY$Vw8e*hQ#=wJW< literal 104060 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

A$*e2!|ZQM~| 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

&pk;dak4NB^d@l{ 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%0DYZFUuTlxnK2lRahQdd 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 S?|(Nr=)eE{|9^+ZH~bI5P1xT6 diff --git a/README.md b/README.md index a26a1d5..afe5179 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ ## Introduction -VDStore is a minimalistic iOS architecture library designed to manage application state in a clean and native manner. It provides a `Store` struct that enables state mutation, state subscription, di injection, and fragmentation into scopes for scaling. VDStore is compatible with both SwiftUI and UIKit. +VDStore is a minimalistic iOS architecture library designed to manage application state in a clean and native manner. +It provides a `Store` struct that enables state mutation, state subscription, di injection, and fragmentation into scopes for scaling. +VDStore is compatible with both SwiftUI and UIKit. ## Features @@ -50,7 +52,8 @@ struct CounterView: View { } } ``` -`ViewStore` is a property wrapper that automatically subscribes to state changes and updates the view. `ViewStore` can be initialized with either `Store` or `State` instances. +`ViewStore` is a property wrapper that automatically subscribes to state changes and updates the view. +`ViewStore` can be initialized with either `Store` or `State` instances. ### Using with UIKit @@ -78,7 +81,10 @@ final class CounterViewController: UIViewController { ### Defining actions You can edit the state in any way you prefer, but the simplest one is extending Store. -There is a helper macro called `@Actions`. `@Actions` redirect all your methods calls through your custom middlewares that allows you to intrecept all calls in runtime. For example, you can use it to log all calls or state changes. Also `@Actions` make all your `async` methods cancellable. +There is a helper macro called `@Actions`. +`@Actions` redirect all your methods calls through your custom middlewares that allows you to intrecept all calls in runtime. +For example, you can use it to log all calls or state changes. +Also `@Actions` make all your `async` methods cancellable. ```swift @Actions extension Store { @@ -158,7 +164,7 @@ import PackageDescription let package = Package( name: "SomeProject", dependencies: [ - .package(url: "https://github.com/dankinsoid/VDStore.git", from: "0.18.0") + .package(url: "https://github.com/dankinsoid/VDStore.git", from: "0.19.0") ], targets: [ .target(name: "SomeProject", dependencies: ["VDStore"]) diff --git a/Sources/VDStore/Store.swift b/Sources/VDStore/Store.swift index 48e83ff..62c7feb 100644 --- a/Sources/VDStore/Store.swift +++ b/Sources/VDStore/Store.swift @@ -25,10 +25,11 @@ import Foundation /// /// ### Scoping /// -/// The most important operation defined on ``Store`` is the ``scope(get:set:)`` or ``scope(_ keyPayh:)`` method, +/// The most important operation defined on ``Store`` is the ``scope(get:set:)`` or ``scope(_ keyPayh:)`` methods, /// which allows you to transform a store into one that deals with child state. This is /// necessary for passing stores to subviews that only care about a small portion of the entire /// application's domain. +/// The store supports dynamic member lookup so that you can scope with a specific field in the state. /// /// For example, if an application has a tab view at its root with tabs for activity, search, and /// profile, then we can model the domain like this: @@ -61,17 +62,17 @@ import Foundation /// var body: some View { /// TabView { /// ActivityView( -/// $state.scope(\.activity) +/// $state.activity /// ) /// .tabItem { Text("Activity") } /// /// SearchView( -/// $state.scope(\.search) +/// $state.search /// ) /// .tabItem { Text("Search") } /// /// ProfileView( -/// $state.scope(\.profile) +/// $state.profile /// ) /// .tabItem { Text("Profile") } /// } @@ -84,17 +85,13 @@ import Foundation /// The `Store` class is isolated to main thread by @MainActor attribute. @MainActor @propertyWrapper +@dynamicMemberLookup public struct Store { /// The state of the store. public var state: State { get { box.state } - nonmutating set { - if suspendAllSyncStoreUpdates, !box.isUpdating { - suspendSyncUpdates() - } - box.state = newValue - } + nonmutating set { box.state = newValue } } /// Injected dependencies. @@ -104,8 +101,7 @@ public struct Store { /// A publisher that emits when state changes. /// - /// This publisher supports dynamic member lookup so that you can pluck out a specific field in - /// the state: + /// This publisher supports dynamic member lookup so that you can pluck out a specific field in the state: /// /// ```swift /// store.publisher.alert @@ -171,7 +167,11 @@ public struct Store { /// // Construct a login view by scoping the store /// // to one that works with only login domain. /// LoginView( - /// store.scope(state: \.login) + /// store.scope { + /// $0.login + /// } set: { + /// $0.login = $1 + /// } /// ) /// ``` /// @@ -217,7 +217,7 @@ public struct Store { /// `LoginView` could be extracted to a module that has no access to `AppFeature`. /// /// - Parameters: - /// - state: A writable key path from `State` to `ChildState`. + /// - keyPath: A writable key path from `State` to `ChildState`. /// - Returns: A new store with its state transformed. public func scope(_ keyPath: WritableKeyPath) -> Store { scope { @@ -227,6 +227,39 @@ public struct Store { } } + /// Scopes the store to one that exposes child state. + /// + /// This can be useful for deriving new stores to hand to child views in an application. For + /// example: + /// + /// ```swift + /// struct AppFeature { + /// var login: Login.State + /// // ... + /// } + /// + /// // A store that runs the entire application. + /// let store = Store(AppFeature()) + /// + /// // Construct a login view by scoping the store + /// // to one that works with only login domain. + /// LoginView( + /// store.login + /// ) + /// ``` + /// + /// Scoping in this fashion allows you to better modularize your application. In this case, + /// `LoginView` could be extracted to a module that has no access to `AppFeature`. + /// + /// - Parameters: + /// - keyPath: A writable key path from `State` to `ChildState`. + /// - Returns: A new store with its state transformed. + public subscript( + dynamicMember keyPath: WritableKeyPath + ) -> Store { + scope(keyPath) + } + /// Injects the given value into the store's. /// - Parameters: /// - keyPath: A key path to the value in the store's dependencies. @@ -265,19 +298,24 @@ public struct Store { /// Suspends the store from updating the UI until the block returns. public func update(_ update: () throws -> T) rethrows -> T { - if !suspendAllSyncStoreUpdates, !box.isUpdating { - defer { box.afterUpdate() } - box.beforeUpdate() - } + defer { box.afterUpdate() } + box.beforeUpdate() let result = try update() return result } +} - /// Suspends the store from updating the UI while all synchronous operations are being performed. - public func suspendSyncUpdates() { - box.beforeUpdate() - DispatchQueue.main.async { [box] in - box.afterUpdate() +public extension Store where State: MutableCollection { + + subscript(_ index: State.Index) -> Store { + scope(index) + } + + func scope(_ index: State.Index) -> Store { + scope { + $0[index] + } set: { + $0[index] = $1 } } } diff --git a/Sources/VDStore/StoreExtensions/Iflet.swift b/Sources/VDStore/StoreExtensions/Iflet.swift new file mode 100644 index 0000000..f5fad10 --- /dev/null +++ b/Sources/VDStore/StoreExtensions/Iflet.swift @@ -0,0 +1,48 @@ +import Foundation + +public extension Store { + + func or(_ defaultValue: @escaping @autoclosure () -> T) -> Store where T? == State { + scope { + $0 ?? defaultValue() + } set: { + $0 = $1 + } + } + + func onChange( + of keyPath: WritableKeyPath, + removeDuplicates isDuplicate: @escaping (V, V) -> Bool, + _ operation: @MainActor @escaping (_ oldValue: V, _ newValue: V, inout State) -> Void + ) -> Store { + scope { + $0 + } set: { + let oldValue = $0[keyPath: keyPath] + $0 = $1 + operation(oldValue, $1[keyPath: keyPath], &$0) + } + } + + func onChange( + of keyPath: WritableKeyPath, + _ operation: @MainActor @escaping (_ oldValue: V, _ newValue: V, inout State) -> Void + ) -> Store { + onChange(of: keyPath, removeDuplicates: ==, operation) + } +} + +public extension Store where State: MutableCollection { + + func forEach(_ operation: @MainActor (Store) throws -> Void) rethrows { + for index in state.indices { + try operation(self[index]) + } + } + + func forEach(_ operation: @MainActor (Store) async throws -> Void) async rethrows { + for index in state.indices { + try await operation(self[index]) + } + } +} diff --git a/Sources/VDStore/Utils/StoreBox.swift b/Sources/VDStore/Utils/StoreBox.swift index f693a1c..0a92ba4 100644 --- a/Sources/VDStore/Utils/StoreBox.swift +++ b/Sources/VDStore/Utils/StoreBox.swift @@ -1,4 +1,5 @@ import Combine +import Foundation struct StoreBox: Publisher { @@ -6,37 +7,24 @@ struct StoreBox: Publisher { var state: Output { get { getter() } - nonmutating set { setter(newValue, true) } + nonmutating set { setter(newValue) } } - var isUpdating: Bool { updatesCounter.wrappedValue > 0 } - var willSet: AnyPublisher { publisher(_willSet) } + let willSet: AnyPublisher + let beforeUpdate: () -> Void + let afterUpdate: () -> Void private let getter: () -> Output - private let setter: (Output, _ sendWillSet: Bool) -> Void - private let _willSet: PassthroughSubject - private let updatesCounter: Ref + private let setter: (Output) -> Void private let valuePublisher: AnyPublisher init(_ value: Output) { - let willSet = PassthroughSubject() - _willSet = willSet - - let valuePublisher = CurrentValueSubject(value) - getter = { valuePublisher.value } - setter = { value, sendWillSet in - if sendWillSet { - willSet.send() - } - valuePublisher.send(value) - } - self.valuePublisher = valuePublisher.eraseToAnyPublisher() - - var updatesCounter: UInt = 0 - self.updatesCounter = Ref { - updatesCounter - } set: { - updatesCounter = $0 - } + let rootBox = StoreRootBox(value) + willSet = rootBox.willSetPublisher + valuePublisher = rootBox.eraseToAnyPublisher() + getter = { rootBox.state } + setter = { rootBox.state = $0 } + beforeUpdate = rootBox.beforeUpdate + afterUpdate = rootBox.afterUpdate } init( @@ -45,38 +33,78 @@ struct StoreBox: Publisher { set: @escaping (inout T, Output) -> Void ) { valuePublisher = parent.valuePublisher.map(get).eraseToAnyPublisher() - _willSet = parent._willSet - updatesCounter = parent.updatesCounter + willSet = parent.willSet getter = { get(parent.getter()) } setter = { var state = parent.getter() set(&state, $0) - parent.setter(state, $1) + parent.setter(state) } + beforeUpdate = parent.beforeUpdate + afterUpdate = parent.afterUpdate } - func beforeUpdate() { - if updatesCounter.wrappedValue == 0 { - _willSet.send() - } - updatesCounter.wrappedValue &+= 1 + func receive(subscriber: S) where S: Subscriber, Never == S.Failure, Output == S.Input { + valuePublisher.receive(subscriber: subscriber) } +} - func afterUpdate() { - updatesCounter.wrappedValue &-= 1 - if updatesCounter.wrappedValue == 0 { - setter(getter(), false) +private final class StoreRootBox: Publisher { + + typealias Output = State + typealias Failure = Never + + var state: State { + get { subject.value } + set { + if suspendAllSyncStoreUpdates, updatesCounter == 0 { + suspendSyncUpdates() + } else if updatesCounter == 0 { + willSet.send() + } + subject.value = newValue } } + var willSetPublisher: AnyPublisher { publisher(willSet) } + + private var updatesCounter = 0 + private let willSet = PassthroughSubject() + private let subject: CurrentValueSubject + + init(_ state: State) { + subject = CurrentValueSubject(state) + } + func receive(subscriber: S) where S: Subscriber, Never == S.Failure, Output == S.Input { - publisher(valuePublisher).receive(subscriber: subscriber) + publisher(subject).receive(subscriber: subscriber) } private func publisher(_ publisher: P) -> AnyPublisher { - publisher.filter { [updatesCounter] _ in - updatesCounter.wrappedValue == 0 + publisher.filter { [weak self] _ in + self?.updatesCounter == 0 } .eraseToAnyPublisher() } + + private func suspendSyncUpdates() { + beforeUpdate() + DispatchQueue.main.async { [self] in + afterUpdate() + } + } + + func beforeUpdate() { + if updatesCounter == 0 { + willSet.send() + } + updatesCounter &+= 1 + } + + func afterUpdate() { + updatesCounter &-= 1 + if updatesCounter == 0 { + subject.value = state + } + } } diff --git a/Tests/VDStoreTests/VDStoreTests.swift b/Tests/VDStoreTests/VDStoreTests.swift index 747bc0d..c4988a0 100644 --- a/Tests/VDStoreTests/VDStoreTests.swift +++ b/Tests/VDStoreTests/VDStoreTests.swift @@ -32,7 +32,7 @@ final class VDStoreTests: XCTestCase { func testScopedStoreInheritsDependencies() { let service: SomeService = MockSomeService() let parentStore = Store(Counter()).di(\.someService, service) - let childStore = parentStore.scope(\.counter) + let childStore = parentStore.counter XCTAssert(childStore.di.someService === service) } @@ -71,6 +71,24 @@ final class VDStoreTests: XCTestCase { XCTAssertEqual(value, 6) } + func testUpdate() { + let store = Store(Counter()) + let publisher = store.publisher + var count = 0 + let cancellable = publisher + .sink { _ in + count += 1 + } + cancellable.store(in: &store.di.cancellableSet) + store.update { + for _ in 0 ..< 10 { + store.add() + } + } + XCTAssertEqual(store.state.counter, 10) + XCTAssertEqual(count, 2) + } + #if swift(>=5.9) /// Test that the publisher property of a Store sends updates when the state changes. func testPublisherUpdates() async { @@ -115,6 +133,19 @@ final class VDStoreTests: XCTestCase { await fulfillment(of: [expectation], timeout: 0.1) XCTAssertEqual(count, 2) } + + func testOnChange() async { + let expectation = expectation(description: "Counter") + let store = Store(Counter()).onChange(of: \.counter) { _, _, state in + state.counter += 1 + } + store.add() + DispatchQueue.main.async { + expectation.fulfill() + } + await fulfillment(of: [expectation], timeout: 0.1) + XCTAssertEqual(store.state.counter, 2) + } #endif }