Comments (5)
This is worth having a discussion about. Thanks @natemann!
Early on we played with some helpers for Void
environments, but in practice we found that these Void
environments almost always became struct environments with dependencies, and that the work to make this happen was less cumbersome if we started with empty struct environments to begin with:
- Fewer places to rename
Void
toXyEnvironment
(a type alias can help here, but that's even more work you have to undo) - Fewer things to change in
pullback
transformations and similar
This is why all of the examples in the repo define struct environments, even if they don't have any dependencies.
Of course, these are just the trade-offs we've currently landed at, and depending on how someone builds an application and how much they modularize, I can see some applications having a lot of small reducers with no dependencies at all benefitting from using Void
for their environments.
One more helper is a reducer initializer that doesn't need to return Effect.none
:
Reducer.init(_: (inout State, Action) -> Void) where Environment == Void
from swift-composable-architecture.
@stephencelis. I see your point.
I was not really thinking about a reducer that does not have to return Effect.none
. I have a few reducers that don't have an environment, but still return an Effect
. Mostly just the fireAndForget
kind.
Secondly, I feel that we can still have an Environment
, but have a reducer that does not return an Effect
. I'm thinking of something like Environment.currentDate that just returns the current time.
I know this is a little off topic, but your last comment intrigued me. My thoughts on Environment == Void
was to not have to write environment: { _ in () }
in pullbacks and scopes.
from swift-composable-architecture.
I have a few reducers that don't have an environment, but still return an
Effect
. Mostly just thefireAndForget
kind.
Worth noting that you'll still want to introduce an environment to supply this work if you want to write tests for those actions. We have a few examples of these kinds of tests in the demo apps. Voice Memos, for one, has some fire-and-forget effects in its audio recorder and audio player dependencies.
My thoughts on
Environment == Void
was to not have to writeenvironment: { _ in () }
in pullbacks and scopes.
Yup! I think those versions of pullback
are definitely handy for reducers with Void
environments.
from swift-composable-architecture.
@natemann We just got a Swift forum for discussions like this so that we can tighten the GitHub issues focus on bugs. Would you like to move the discussion there?
from swift-composable-architecture.
Sure thing.
from swift-composable-architecture.
Related Issues (20)
- Alert state remaining when dismissing alert HOT 1
- Tree-based navigation deeplinking shows mostly blank screens HOT 2
- onChange not work for state change by setter HOT 1
- Default title text for alerts generates log errors when using string catalogs
- Mapping AnyPublisher to Effect with the Latest Swift Composable Architecture HOT 1
- StackState/StackReducer related leak HOT 3
- Publisher animation is not working HOT 3
- Stack based navigation throw error when write to userdefault in reducer and use scenePhase environment key HOT 1
- Sendable warnings (Animation) HOT 2
- Drop `Equatable` constraint for `Value` in `_OnChangeReducer` HOT 1
- When using switch store onAppear method not being ran in child HOT 1
- Xcode Cloud can't build projects that uses Composable Architecture v1.4.0 HOT 1
- libiraty tuist errir HOT 1
- Static dependencies HOT 3
- Extension for Reducer.State/Action causes a compilation error with the new @Reducer macros HOT 2
- Circular reference error using @Reducer with an extension on reducer's State HOT 2
- The .legacyAlert modifier on a child view will be ignored. HOT 11
- Crash in 1.5.2 - Unwrapping in IfLetStore, line 88 HOT 5
- 1.5.4 action from run not called HOT 7
- Build error "Undefined symbols" when building with internal type in a package HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from swift-composable-architecture.