mirror of
https://github.com/pointfreeco/swift-composable-architecture.git
synced 2025-12-20 09:11:33 +01:00
* wip
* fix
* wip
* wip
* move
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Fix
* wip
* wip
* Renamed action to onTap in NavigationLinkStore (#2043)
Renamed the `action` parameter to mirror other inits and differentiate itself from `action fromDestinationAction`
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Tie view identity to stack element identity
* Tie item identity to case
* wip
* wip
* cleanup
* fix
* fix
* Add warning to nav link
* wip
* wip
* Rename FullscreenCover.swift to FullScreenCover.swift (#2062)
* wip
* fix isDetailLink on non-iOS platforms
* Correct some comments in Effect.swift (#2081)
* add integration tests for showing alert/dialog from alert/dialog.
* copy StackElementIDGenerator dependency before running TestStore receive closure.
* Removed some unneeded delegate actions.
* wip
* clean up
* lots of clean up
* Converted voice memos back to identified array
* update deps
* update docs for DismissEffect
* wip
* Add Sendable conformance to PresentationState (#2086)
* wip
* swift-format
* wip
* wip
* docs
* wip
* wip
* Catch some typos in Articles (#2088)
* wip
* wip
* wip
* wip
* wip
* docs
* wip
* wip
* docs
* wip
* wip
* wip
* wip
* docs
* docs
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Fix invalid states count for 3 optionals and typos (#2094)
* wip
* wip
* more dismisseffect docs
* fixed some references
* navigation doc corrections
* more nav docs
* fix cancellation tests in release mode
* wrap some tests in #if DEBUG since they are testing expected failures
* update UUIDs in tests to use shorter initializer
* fixed a todo
* wip
* fix merge errors
* wip
* fix
* wip
* wip
* fixing a bunch of todos
* get rid of rawvalue in StackElementID
* more todos
* NavLinkStore docs
* fix swift 5.6 stuff
* fix some standups tests
* fix
* clean up
* docs fix
* fixes
* wip
* 5.6 fix
* wip
* wip
* dont parallelize tests
* updated demo readmes
* wip
* Use ObservedObject instead of StateObject for alert/dialog modifiers.
* integration tests for bad dismissal behavior
* check for runtime warnings in every integration test
* wip
* wip
* fix
* wip
* wip
* wip
* wip
* wip
* Drop a bunch of Hashables.
* some nav bug fixes
* wip
* wip
* wip
* fix
* fix
* wip
* wip
* Simplify recording test.
* add concurrent async test
* fix
* wip
* Refact how detail dismisses itself.
* fix
* 5.6 fix
* wip
* wip
* Add TestStore.assert.
* Revert "Add TestStore.assert."
This reverts commit a892cccc66.
* add Ukrainian Readme.md (#2121)
* Add TestStore.assert. (#2123)
* Add TestStore.assert.
* wip
* Update Sources/ComposableArchitecture/TestStore.swift
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
* Update Sources/ComposableArchitecture/Documentation.docc/Extensions/TestStore.md
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
* fix tests
---------
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
* Run swift-format
* push for store.finish and presentation
* move docs around
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Add case subscripts
* wip
* wip
* 5.7-only
* wip
* wip
* wip
* wip
* revert store.finish task cancellation
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* add test for presentation scope
* wip
* wip
* wip
* wip
* wip
* cleanup
* updated presentation scope test
* sytnax update
* clean up
* fix test
* wip
* wip
* wip
* wip
* wip
---------
Co-authored-by: Brandon Williams <mbrandonw@hey.com>
Co-authored-by: Martin Václavík <mvaclavik96@icloud.com>
Co-authored-by: 유재호 <y73447jh@gmail.com>
Co-authored-by: Jackson Utsch <jutechs@gmail.com>
Co-authored-by: Dmytro <barabashdmyto@gmail.com>
Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com>
Co-authored-by: mbrandonw <mbrandonw@users.noreply.github.com>
88 lines
2.1 KiB
Swift
88 lines
2.1 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.state.value, 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.state.value, level: level) == 0)
|
|
_cancellationCancellables.removeAll()
|
|
}
|
|
}
|
|
}
|
|
|
|
private struct Feature: ReducerProtocol {
|
|
struct State {
|
|
@PresentationState var child: State?
|
|
var count = 0
|
|
}
|
|
enum Action {
|
|
indirect case child(PresentationAction<Action>)
|
|
case tap
|
|
case none
|
|
}
|
|
var body: some ReducerProtocol<State, Action> {
|
|
Reduce<State, Action> { state, action in
|
|
switch action {
|
|
case .child:
|
|
return .none
|
|
case .tap:
|
|
state.count = 1
|
|
return Empty(completeImmediately: true)
|
|
.eraseToEffect()
|
|
.cancellable(id: UUID())
|
|
case .none:
|
|
return .none
|
|
}
|
|
}
|
|
.ifLet(\.$child, action: /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)
|
|
}
|