Skip to content

Commit

Permalink
Merge pull request #5 from Ryu0118/feature/improve-performance
Browse files Browse the repository at this point in the history
Changed behavior when ReducerState is Never when using ManualStoreBuilder
  • Loading branch information
Ryu0118 authored Jul 26, 2023
2 parents 836ef0e + eb02d9f commit b644abd
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
6 changes: 6 additions & 0 deletions Sources/SimplexArchitecture/SimplexStoreBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,10 @@ public extension SimplexStoreBuilder {
_store = newValue
}
}

@discardableResult
@inlinable
func send(_ action: consuming Reducer.Action) -> SendTask where Reducer.ReducerState == Never {
store.sendIfNeeded(action: action)!
}
}
14 changes: 8 additions & 6 deletions Sources/SimplexArchitecture/SimplexStoreView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ public protocol StatesProtocol<Target> {
}

public extension SimplexStoreView where Reducer.ReducerState == Never {
@discardableResult
@inlinable
func send(_ action: consuming Reducer.Action) -> SendTask {
store.sendIfNeeded(action: action)!
func send(_ action: consuming Reducer.Action) -> SendTask where Reducer.ReducerState == Never {
if store.send == nil {
store.sendIfReducerStateNever(action: action, target: self)
} else {
store.sendIfNeeded(action: action)!
}
}
}

Expand All @@ -26,9 +28,9 @@ public extension SimplexStoreView {
@_disfavoredOverload
func send(_ action: consuming Reducer.Action) -> SendTask {
if store.send == nil {
store.sendIfNeeded(action: action)!
} else {
store.sendIfReducerStateExists(action: action, target: self)
} else {
store.sendIfNeeded(action: action)!
}
}
}
31 changes: 30 additions & 1 deletion Sources/SimplexArchitecture/Store.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ public final class Store<Target> where Target: SimplexStoreView {
self.storeType = .normal
}

public init(
reducer: @escaping @autoclosure () -> Target.Reducer
) where Target.Reducer.ReducerState == Never {
self.storeType = .lazy(reducer: reducer)
}

public init(
reducer: @autoclosure @escaping () -> Target.Reducer,
initialReducerState: @autoclosure @escaping () -> Target.Reducer.ReducerState
Expand All @@ -37,7 +43,7 @@ extension Store {
let send = Send(reducer: reducer(), target: target, reducerState: initialReducerState())
defer { self.send = send }
return send(action)
case .normal:
case .normal, .lazy:
fatalError("Unreachable")
}
}
Expand All @@ -50,10 +56,33 @@ extension Store {
}
}

extension Store where Target.Reducer.ReducerState == Never {
func sendIfReducerStateNever(
action: consuming Target.Reducer.Action,
target: consuming Target
) -> SendTask {
if let send {
return send(action)
} else {
switch storeType {
case let .lazy(reducer):
let send = Send(reducer: reducer(), target: target)
defer { self.send = send }
return send(action)
default: fatalError("Unreachable")
}
}
}
}

private extension Store {
enum StoreType {
case normal

case lazy(
reducer: () -> Target.Reducer
)

case containReducerState(
reducer: () -> Target.Reducer,
initialReducerState: () -> Target.Reducer.ReducerState
Expand Down

0 comments on commit b644abd

Please sign in to comment.