Skip to content

Commit f6e41cb

Browse files
committed
🐛 Remove Station's state and replace it with StateStorage
1 parent 55864ba commit f6e41cb

2 files changed

Lines changed: 18 additions & 44 deletions

File tree

Sources/Dripper/StateStorage.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,17 @@ public actor StateStorage<State: Sendable, Action: Sendable>: StateYieldPolicy {
5858

5959
// MARK: Functions
6060

61+
@MainActor
62+
public subscript<Member>(
63+
dynamicMember dynamicMember: ReferenceWritableKeyPath<State, Member> & Sendable
64+
) -> Member {
65+
get { state[keyPath: dynamicMember] }
66+
set {
67+
state[keyPath: dynamicMember] = newValue
68+
continuation.yield(state)
69+
}
70+
}
71+
6172
func pour(_ action: Action) async {
6273
let taskID = UUID()
6374
// let oldState = state
@@ -85,17 +96,6 @@ public actor StateStorage<State: Sendable, Action: Sendable>: StateYieldPolicy {
8596
}
8697
}
8798

88-
@MainActor
89-
subscript<Member>(
90-
dynamicMember dynamicMember: ReferenceWritableKeyPath<State, Member> & Sendable
91-
) -> Member {
92-
get { state[keyPath: dynamicMember] }
93-
set {
94-
state[keyPath: dynamicMember] = newValue
95-
continuation.yield(state)
96-
}
97-
}
98-
9999
private func removeTask(_ key: UUID) {
100100
if let task = tasks.removeValue(forKey: key) {
101101
task.cancel()

Sources/Dripper/Station.swift

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,7 @@ public final class Station<State: StationState, Action: Sendable>: StateYieldPol
3535

3636
// MARK: Properties
3737

38-
/// The current state of the station.
39-
///
40-
/// Since ``Dripper/Dripper/State`` is a class type, it's referenced by both ``Station`` and ``StateHandler``.
41-
public private(set) var state: State
42-
43-
private let stateStorage: StateStorage<State, Action>
44-
45-
private let continuation: AsyncStream<State>.Continuation
46-
private var task: Task<Void, Never>?
38+
private let state: StateStorage<State, Action>
4739

4840
// MARK: Lifecycle
4941

@@ -62,42 +54,25 @@ public final class Station<State: StationState, Action: Sendable>: StateYieldPol
6254
}
6355

6456
init<D: Dripper>(state: D.State, dripper: D) where D.State == State, D.Action == Action {
65-
self.state = state
66-
6757
let stateStorage = StateStorage(initialState: state, dripper: dripper)
68-
self.stateStorage = stateStorage
69-
self.continuation = stateStorage.continuation
70-
71-
// Update `state` as `StateHandler`'s `state` is updated.
72-
self.task = Task { @MainActor [weak self] in
73-
guard let stateStream = await self?.stateStorage.stream else { return }
74-
for await state in stateStream {
75-
guard let self else { break }
76-
self.state = state
77-
}
78-
}
58+
self.state = stateStorage
7959
}
8060

81-
deinit {
82-
task?.cancel()
83-
}
61+
deinit { }
8462

8563
// MARK: Functions
8664

8765
public func pour(_ action: Action) {
8866
Task {
89-
await stateStorage.pour(action)
67+
await state.pour(action)
9068
}
9169
}
9270

9371
public subscript<Member>(
94-
dynamicMember dynamicMember: ReferenceWritableKeyPath<State, Member>
72+
dynamicMember dynamicMember: ReferenceWritableKeyPath<StateStorage<State, Action>, Member>
9573
) -> Member {
9674
get { state[keyPath: dynamicMember] }
97-
set {
98-
state[keyPath: dynamicMember] = newValue
99-
continuation.yield(state)
100-
}
75+
set { state[keyPath: dynamicMember] = newValue }
10176
}
10277
}
10378

@@ -106,15 +81,14 @@ import SwiftUI
10681

10782
extension Station {
10883
public func bind<Member>(
109-
_ dynamicMember: ReferenceWritableKeyPath<State, Member>
84+
_ dynamicMember: ReferenceWritableKeyPath<StateStorage<State, Action>, Member>
11085
) -> Binding<Member> {
11186
Binding(
11287
get: {
11388
self.state[keyPath: dynamicMember]
11489
},
11590
set: { newValue in
11691
self.state[keyPath: dynamicMember] = newValue
117-
self.continuation.yield(self.state)
11892
}
11993
)
12094
}

0 commit comments

Comments
 (0)