* Shared State
* fix compiler errors in 5.7
* fixes and tests
* fix
* fix
* wip
* longer sleeps
* fix test
* fix tests
* Clean up some typos in SharingState.md (#2860)
* public inits
* wip
* wip
* add test for shared state and onChange
* Case study for sandboxing shared state
* tweaks to case study
* wip
* add tests to sandboxing case study
* rename files
* wip
* simplify sync up tests
* wip
* fix
* wip
* fix $shared.publisher non-determinism and write test that currently fails but ideally would not.
* more docs and a test for autoclosure
* more docs
* wip
* update todo with persistence
* wip
* wip
* support default `nil` optionals in `@Shared`
* Introduce unavailable overload for better diagnostics
* Fix autocomplete from `@Shared(.`
* Revert "Fix autocomplete from `@Shared(.`"
This reverts commit fd1798f9f5.
* Fix defaults
* wip
* Give persistence keys a synchronous update interface (#2880)
* Don't use async sequence for persistence
* wip
* wip
* wip
* Update Sources/ComposableArchitecture/SharedState/PersistenceKey.swift
Co-authored-by: Hal Lee <hal@lee.me>
---------
Co-authored-by: Hal Lee <hal@lee.me>
* Revert sharing in Todos for now
* wip
* wip
* Pass initial shared value to strategy / register app storage (#2904)
* Pass initial shared value to strategy / register app storage
This PR modifies the `PersistenceKey` protocol so that its `load` and
`subscribe` endpoints are handed the initial value and must return a
non-optional value. By feeding this value in, we can ensure that
`.appStorage` declared in a feature is registered outside the feature.
* wip
* wip
* wip
* wip
* wip
* wip
* swift-format
* Update Sources/ComposableArchitecture/Documentation.docc/Articles/SharingState.md
Co-authored-by: Pyry Jahkola <pyry.jahkola@iki.fi>
* non-exhaustive fix
* wip
* remove decodable for now
* Fix app storage registration with `nil` values
* fix
* wip
* tutorial
* fixes
* lots of tutorial fixes
* more tutorial fixes
* more tutorial fixes
* more tutorial fixes
* tutorial fixes
* wip
* re-arrange test
* Remove store shared preview quarantine
* Add support for \.defaultInMemoryStorage (#2965)
* fix
* Added Privacy Manifest file (#2930)
* Added Privacy Manifest file
* Update Package@swift-5.9.swift
---------
Co-authored-by: Stephen Celis <stephen.celis@gmail.com>
* remove warning overloads
* write default instead of register
this is more consistent with SwiftUI's property wrapper, and causes less
strangeness when multiple repeat properties have different defaults
* move privacy manifest
* wip
* wip
* EphemeralFileStorage -> InMemoryFileStorage
* documented gotcha
* add test
* Shared state beta task snaps (#2976)
* wip
* wip
* wip
* wip
* wip
* wip
* wip
---------
Co-authored-by: Brandon Williams <mbrandonw@hey.com>
* wip
* Use notification center instead of KVO for user defaults observation. (#2978)
* Use notification center instead of KVO for user defaults observation.
* wip
* wip
* Introduce @SharedReader (#2979)
* wip
* wip
* wip
* wip
* wip
* wip
* Introduce @SharedReader.
* wip
* wip
* sendable
* wip
* wip
---------
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
* Make Shared.Subscription.cancel public (#2983)
* added failing test
* Add convenience initializers
* Save to file storage when app is about to be terminated (#2992)
* Save file storage on termination too.
* wip
* Shared change tracking enhancements (#2989)
* wip
* wip
* wip
* wip
* Add unavailable conformance
* wip
* wip
* wip
* Don't need to check for previews.
* Add default providing persistence key (#2980)
* wip - default providing key
* warn on default access
* Revert "warn on default access"
This reverts commit 38706450bef44a50f94afeaddbc4628e383b52b3.
* wip
* wip
* wip - tests
* wip - reader key
* fix docs
* A few changes.
* A few more changes.
* docs
---------
Co-authored-by: Brandon Williams <mbrandonw@hey.com>
* Fix optional shared defaults.
* undo last commit but keep test
* wip
* Better shared state change tracking and `TestStore` interactions (#2995)
* A fix for shared assertion.
* fixes
* wip
---------
Co-authored-by: Brandon Williams <mbrandonw@hey.com>
* docs
* docs
* wip
* Throttle for 1 second.
* fix typo in examples: `let` -> `var` (#2999)
Co-authored-by: Andreas Tielmann <atielmann@deloitte.de>
* wip
* wip
* fix observing projection
* Ping `Shared.publisher` in `willSet` so prev/next values observable
* wip
* wip
* remove sandbox demo
* wip
* wip
* recover inlining
* wip
* wip
* fix docc
* wip
* wip
* re-entrant test
* wip
* Don’t assume CastableLookup (#3011)
* Don’t assume CastableLookup
If the observed value in `UserDefaults` is a `RawRepresentable` type, simply casting to `Value` might fail because the raw representing type could be different from `Value`. Instead of querying `UserDefaults` directly here, we should call `loadValue()` which will do the right thing for raw representable types (esp. try to call `Value.init(rawValue:)` with the value obtained from `UserDefaults`).
* Add test
---------
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
* Make `FileStorage` more opaque (#3010)
* Make `FileStorage` more opaque
Previously, we had a public protocol and conformances, but we don't
expect anyone to conform outside the library, so instead let's hide
things in a more opaque struct.
The downside of this PR is that it's a breaking API change pretty late
in the game:
```diff
-$0.defaultFileStorage = InMemoryFileStorage()
+$0.defaultFileStorage = .inMemory
```
We could add public deprecated functions that emulate the old
initializers if we think it's worth it...
* wip
* wip
* wip
* wip
* wip
* wip
* fix for 5.7.1
* sync ups clean up
* more docs
* more tests
* shared testing tiups
* wip
* wip
* Fix typo. (#3014)
* more shared state docs
* relax version of swift-dependencies.
* dep change
* fix == and hash on Shared and more tests
* revert == changes
* add test
* Remove hashable conformance from shared
* remove conditional encodability from shared
* wip
* remove syncups tutorial
* wip
* fix
* fix file storage deletion resubscription
* wip
* wip
* wip
* wip
* wip
* fix
* eager throttle
---------
Co-authored-by: Brandon Williams <mbrandonw@hey.com>
Co-authored-by: NF <4764329+NFulkerson@users.noreply.github.com>
Co-authored-by: Hal Lee <hal@lee.me>
Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com>
Co-authored-by: Pyry Jahkola <pyry.jahkola@iki.fi>
Co-authored-by: Daniel Lyons <72824209+DandyLyons@users.noreply.github.com>
Co-authored-by: Hilton Campbell <github@crosswaterbridge.com>
Co-authored-by: Luke Redpath <lredpath@community.com>
Co-authored-by: andtie <andreas.tielmann@gmail.com>
Co-authored-by: Andreas Tielmann <atielmann@deloitte.de>
Co-authored-by: Alex Kovács <alex@kobachi.jp>
Co-authored-by: Zev Eisenberg <zev@zeveisenberg.com>
This API has been more problematic than not, especially when folks
accidentally type `.cancel(id:)` and pass a hashable array when they
expect to be passing multiple tokens along to each cancel. Let's avoid
the confusion by deprecating the functionality.
Cancelling multiple tokens at once should also be less common these days
now that navigation tools bakes cancellation into dismissal.
* Deprecate `Store.scope(state:)` for view store `observe`
Explicit scoping is most appropriate for transforming domains, which
almost always requires an action transform. In the rare case it doesn't,
we should prefer an explicit `{ $0 }`.
Scoping for the view has been deprecated for awhile for the `observe`
parameter when creating view stores, so let's lead folks that direction.
* wip
* wip
* Deprecate type-based cancel IDs
Swift may aggressively compile types out of release mode, including
types defined for cancellation. Because of this, folks should migrate to
use value-based identifiers and avoid any potential bugs.
* wip
* wip
Runtime warnings are not test helpers that should propagate XCTest
failures to the original file/line, so we should always omit that
information. This leads to better test failures that show up alongside
the test, not buried in application code.
* Rollback to a top level `Send`
* Rename `EffectSend` as `Send`
* Add a `Sendable` typealias to `ReducerProtocol`
* Revert "Add a `Sendable` typealias to `ReducerProtocol`"
This reverts commit d808d3c916.
---------
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
The -`able` naming evokes protocols in Swift, and is an outlier when
considered alongside the rest of TCA's binding tools:
- `BindingAction`: concrete type
- `BindableAction`: protocol
- `BindingReducer`: concrete type
So, let's make things consistent.
The one caveat is that Swift diagnostics for such a deprecation aren't
great, so users won't get proactive warnings here for the time being:
https://github.com/apple/swift/issues/63139
We may just want to keep the deprecation around till it does...
It occurred to us that this solution unfortunately is incompatible with
view actions. We have an alternate solution that works, so I'll PR that
in the future if no others materialize!
* Simpler bindable view state
* wip
* wip
* Remove `BindingStore`
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* wip
* Make BindingState conditionally sendable.
* Fixed tests
* Update bindings article
* Add some additional contextual information to the runtime warnings
* update some docs
* lots more docs
* test clean up
* Improve diagnostic
* Put back `BindingReducer()` in the form study
* clean up
* Improve DocC references
* Remove DocC references for `@`'d property wrappers.
* wip
Co-authored-by: Stephen Celis <stephen@stephencelis.com>
Co-authored-by: Brandon Williams <mbrandonw@hey.com>
* Loosen platform requirements for Dependencies
Dependencies depends on runtime warning functionality, which is brought
in via the "os" module. If we check for availability we can allow the
Dependencies module to be used from multiplatform libraries, as we have
in isowords.
* More agnostic
* wip
* Update RuntimeWarnings.swift
* Update RuntimeWarnings.swift
* Rename Effect<Output, _> -> Effect<Action, _>
We'll keep the typealias for the `Publisher` conformance, but given the
changes made to TCA for concurrency, `Effect` should typically only be
used these days in reducers to feed actions back into the store, and not
more generally as publishers of any output.
* wip