Files
swift-composable-architectu…/Sources/swift-composable-architecture-benchmark/StoreSuite.swift
Stephen Celis 57e804f1cc Macro bonanza (#2553)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Silence test warnings

* wip

* wip

* wip

* update a bunch of docs

* wip

* wip

* fix

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Kill integration tests for now

* wip

* wip

* wip

* wip

* updating docs for @Reducer macro

* replaced more Reducer protocols with @Reducer

* Fixed some broken docc references

* wip

* Some @Reducer docs

* more docs

* convert some old styles to new style

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* bump

* update tutorials to use body

* update tutorials to use DML on destination state enum

* Add diagnostic

* wip

* updated a few more tests

* wip

* wip

* Add another gotcha

* wip

* wip

* wip

* fixes

* wip

* wip

* wip

* wip

* wip

* fix

* wip

* remove for now

* wip

* wip

* updated some docs

* migration guides

* more migration guide

* fix ci

* fix

* soft deprecate all apis using AnyCasePath

* wip

* Fix

* fix tests

* swift-format 509 compatibility

* wip

* wip

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>

* wip

* wip

* update optional state case study

* remove initializer

* Don't use @State for BasicsView integration demo

* fix tests

* remove reduce diagnostics for now

* diagnose error not warning

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Jesse Tipton <jesse@jessetipton.com>

* wip

* move integration tests to cron

* Revert "move integration tests to cron"

This reverts commit f9bdf2f04b.

* disable flakey tests on CI

* wip

* wip

* Revert "Revert "move integration tests to cron""

This reverts commit 66aafa7327.

* fix

* wip

* fix

---------

Co-authored-by: Brandon Williams <mbrandonw@hey.com>
Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>
Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com>
Co-authored-by: Jesse Tipton <jesse@jessetipton.com>
2023-11-13 12:57:35 -08:00

87 lines
2.0 KiB
Swift

import Benchmark
import Combine
@_spi(Internals) import ComposableArchitecture
import Foundation
let storeSuite = BenchmarkSuite(name: "Store") {
var store: StoreOf<Feature>!
let levels = 5
for level in 1...levels {
$0.benchmark("Nested send tap: \(level)") {
store.send(tap(level: level))
} setUp: {
store = Store(initialState: state(level: level)) {
Feature()
}
} tearDown: {
precondition(count(of: store.withState { $0 }, level: level) == 1)
_cancellationCancellables.removeAll()
}
}
for level in 1...levels {
$0.benchmark("Nested send none: \(level)") {
store.send(none(level: level))
} setUp: {
store = Store(initialState: state(level: level)) {
Feature()
}
} tearDown: {
precondition(count(of: store.withState { $0 }, level: level) == 0)
_cancellationCancellables.removeAll()
}
}
}
@Reducer
private struct Feature {
struct State {
@PresentationState var child: State?
var count = 0
}
enum Action {
indirect case child(PresentationAction<Action>)
case tap
case none
}
var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .child:
return .none
case .tap:
state.count = 1
return .publisher { Empty() }.cancellable(id: UUID())
case .none:
return .none
}
}
.ifLet(\.$child, action: \.child) {
Feature()
}
}
}
private func state(level: Int) -> Feature.State {
Feature.State(
child: level == 0
? nil
: state(level: level - 1)
)
}
private func tap(level: Int) -> Feature.Action {
level == 0
? .tap
: Feature.Action.child(.presented(tap(level: level - 1)))
}
private func none(level: Int) -> Feature.Action {
level == 0
? .none
: Feature.Action.child(.presented(none(level: level - 1)))
}
private func count(of state: Feature.State?, level: Int) -> Int? {
level == 0
? state?.count
: count(of: state?.child, level: level - 1)
}