Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Address Effect.throttle sendability #3325

Merged
merged 1 commit into from
Aug 30, 2024
Merged

Conversation

stephencelis
Copy link
Member

Addressing some more sendability warnings.

@stephencelis stephencelis requested a review from mbrandonw August 29, 2024 22:57
import Dispatch
import Foundation

extension Effect {
extension Effect where Action: Sendable {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the action flows through Combine across potential concurrency boundaries, I think we're forced to require a sendable action here. It's possible we could weaken this with a pure Swift concurrency throttle.

@@ -23,12 +23,13 @@ extension Effect {
/// `false`, the publisher emits the first element received during the interval.
/// - Returns: An effect that emits either the most-recent or first element received during the
/// specified interval.
public func throttle<S: Scheduler>(
public func throttle<S: Scheduler & Sendable>(
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The scheduler also travels across concurrency boundaries, so it needs to be sendable. Dispatch queues are sendable, but run loops are not. Combine's ImmediateScheduler is also not sendable, but our .immediate scheduler is, as is our TestScheduler, so I think this is safe to do, it'll just mean folks shouldn't throttle with a run loop.

id: some Hashable & Sendable,
for interval: S.SchedulerTimeType.Stride,
scheduler: S,
latest: Bool
) -> Self {
) -> Self
where S.SchedulerTimeType.Stride: Sendable {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another requirement. Dispatch queue's stride type is sendable.

@stephencelis stephencelis merged commit 63b0780 into main Aug 30, 2024
6 checks passed
@stephencelis stephencelis deleted the effect-throttle-sendability branch August 30, 2024 16:14
mbrandonw pushed a commit that referenced this pull request Sep 6, 2024
mbrandonw added a commit that referenced this pull request Sep 6, 2024
* Address @shared sendability.

* Undo UncheckedSendable<UserDefaults>.

* clean up

* wip

* drop AnySendable.

* wip

* Address `Effect.throttle` sendability (#3325)

* Address effect cancellation sendability (#3326)

* Address effect cancellation sendability

* fix

* wip

* wip

* Separate SendableDefaultSubscript from DefaultSubscript.

* fix test

* drop escaping

* switch on swift 6 language mode

* xcode 16

* update test

* wip

---------

Co-authored-by: Stephen Celis <stephen@stephencelis.com>
mergify bot referenced this pull request in cgrindel/rules_swift_package_manager Sep 16, 2024
…ure to from: "1.15.0" (#1230)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[pointfreeco/swift-composable-architecture](https://redirect.github.com/pointfreeco/swift-composable-architecture)
| minor | `from: "1.13.1"` -> `from: "1.15.0"` |

---

### Release Notes

<details>
<summary>pointfreeco/swift-composable-architecture
(pointfreeco/swift-composable-architecture)</summary>

###
[`v1.15.0`](https://redirect.github.com/pointfreeco/swift-composable-architecture/releases/tag/1.15.0)

[Compare
Source](https://redirect.github.com/pointfreeco/swift-composable-architecture/compare/1.14.0...1.15.0)

#### What's Changed

- Added: Complete Swift 6 Language Mode support
([https://github.com/pointfreeco/swift-composable-architecture/pull/3282](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3282),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3318](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3318);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3317](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3317);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3321](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3321);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3325](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3325);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3326](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3326);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3320](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3320);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3333](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3333);
[https://github.com/pointfreeco/swift-composable-architecture/pull/3329](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3329)).
- Fixed: Warn when bindable store is sent a binding action without
having integrated with `BindingReducer`
([https://github.com/pointfreeco/swift-composable-architecture/pull/3347](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3347)).
- Fixed: Remove and lock subscriptions from the Combine subject powering
Store and Shared subscriptions (thanks
[@&#8203;iampatbrown](https://redirect.github.com/iampatbrown),
[https://github.com/pointfreeco/swift-composable-architecture/pull/2699](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/2699)).
This should improve memory and avoid potential issues related to
concurrent access to the publisher.
- Fixed: Avoid potential deadlock in `Shared` by dispatching to the main
actor
([https://github.com/pointfreeco/swift-composable-architecture/pull/3356](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3356)).
- Fixed: Swift Testing support for concurrent tests by bucketing
cancellation identifiers to each `@Test`
([https://github.com/pointfreeco/swift-composable-architecture/pull/3374](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3374)).
- Infrastructure: Remove disfavored `NSObject.observe` overload in favor
of SwiftNavigation's `observe`
([https://github.com/pointfreeco/swift-composable-architecture/pull/3316](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3316))
- Infrastructure: Fix typo and deprecated content in `Performance.md`
(thanks [@&#8203;MaraMincho](https://redirect.github.com/MaraMincho),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3323](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3323));
'WhatIsNavigation.md' fixes (thanks
[@&#8203;stealmh](https://redirect.github.com/stealmh),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3345](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3345));
fix typos (thanks
[@&#8203;stealmh](https://redirect.github.com/stealmh),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3349](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3349);
thanks [@&#8203;O-O-wl](https://redirect.github.com/O-O-wl),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3354](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3354));
replace deprecated `viewStore` with `store` in documentation (thanks
[@&#8203;qwerty3345](https://redirect.github.com/qwerty3345),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3341](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3341)).
- Infrastructure: Added failing test to document behavior with
observation/identified array
([https://github.com/pointfreeco/swift-composable-architecture/pull/3346](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3346)).
- Infrastructure: Update `05-HigherOrderReducers` CaseStudies (thanks
[@&#8203;qwerty3345](https://redirect.github.com/qwerty3345),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3342](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3342));
update `04-Navigation-Lists-NavigateAndLoad` CaseStudies (thanks
[@&#8203;MaraMincho](https://redirect.github.com/MaraMincho),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3327](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3327)).
- Infrastructure: Issue template updates
([https://github.com/pointfreeco/swift-composable-architecture/pull/3363](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3363)).
- Infrastructure: Apply `any` to all existential protocol uses (thanks
[@&#8203;qwerty3345](https://redirect.github.com/qwerty3345),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3370](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3370)).
- Infrastructure: Improve CI job performance
([https://github.com/pointfreeco/swift-composable-architecture/pull/3357](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3357)).
- Infrastructure: Remove outdated `#if` branching in the library
([https://github.com/pointfreeco/swift-composable-architecture/pull/3376](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3376)).

#### New Contributors

- [@&#8203;stealmh](https://redirect.github.com/stealmh) made their
first contribution in
[https://github.com/pointfreeco/swift-composable-architecture/pull/3345](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3345)
- [@&#8203;O-O-wl](https://redirect.github.com/O-O-wl) made their first
contribution in
[https://github.com/pointfreeco/swift-composable-architecture/pull/3354](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3354)

**Full Changelog**:
pointfreeco/swift-composable-architecture@1.14.0...1.15.0

###
[`v1.14.0`](https://redirect.github.com/pointfreeco/swift-composable-architecture/releases/tag/1.14.0)

[Compare
Source](https://redirect.github.com/pointfreeco/swift-composable-architecture/compare/1.13.1...1.14.0)

#### What's Changed

- Added: Isolate `Store`, `TestStore`, and various view helpers to the
`@MainActor`
([https://github.com/pointfreeco/swift-composable-architecture/pull/3277](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3277),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3283](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3283)).
This has been done with `@preconcurrency` for backwards compatibility.
If you are using strict concurrency it may require you add `@MainActor`
annotations to any SwiftUI view helpers that access the store.
- Fixed: Don't eagerly dismiss an alert presented by another
([https://github.com/pointfreeco/swift-composable-architecture/pull/3309](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3309)).
- Infrastructure: Bump Swift Navigation version
([https://github.com/pointfreeco/swift-composable-architecture/pull/3310](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3310)).
- Infrastructure: Documentation fixes (thanks
[@&#8203;woohyunjin06](https://redirect.github.com/woohyunjin06),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3296](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3296);
[@&#8203;MaraMincho](https://redirect.github.com/MaraMincho),
[https://github.com/pointfreeco/swift-composable-architecture/pull/3299](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3299)).

#### New Contributors

- [@&#8203;woohyunjin06](https://redirect.github.com/woohyunjin06) made
their first contribution in
[https://github.com/pointfreeco/swift-composable-architecture/pull/3296](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3296)
- [@&#8203;MaraMincho](https://redirect.github.com/MaraMincho) made
their first contribution in
[https://github.com/pointfreeco/swift-composable-architecture/pull/3299](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3299)
- [@&#8203;qwerty3345](https://redirect.github.com/qwerty3345) made
their first contribution in
[https://github.com/pointfreeco/swift-composable-architecture/pull/3305](https://redirect.github.com/pointfreeco/swift-composable-architecture/pull/3305)

**Full Changelog**:
pointfreeco/swift-composable-architecture@1.13.1...1.14.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC44MC4wIiwidXBkYXRlZEluVmVyIjoiMzguODAuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: cgrindel-self-hosted-renovate[bot] <139595543+cgrindel-self-hosted-renovate[bot]@users.noreply.github.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants