Comments (10)
I believe @agentk was in favor of this as well. If that's the case I'd be happy to deprecate the Reducer
protocol with the next release and add support for free functions.
from reswift.
Yes, we could potentially do this! The reducer protocol is an artifact from an older ReSwift version. One of the advantages of using a type instead of a free function is that the error message around type mismatches in the store and the root-reducer is slightly better.
However, our docs have been suggesting using free functions for any but the root reducer function; so it might be more consistent to change this.
I don't have a strong opinion either way. I would love to see the change on a branch to see the impact it would have.
@ReSwift/reswift any opinions on this?
from reswift.
A reducer type doesn't have much value in my app TableFlip so far compared to a free function. So I think this is okay. Where the function lives is up to the team anyway -- they could create a Reducers struct with static functions and reference these, for example.
from reswift.
I also agree that they should be free functions ๐
from reswift.
I like the idea of deprecating Reducer
, but what I like even more is turning Reducer
into a concrete struct that allows mapping and concatenating Reducer
s with ease. I've implemented this in ReactiveReSwift and I'm very happy with the results. Here's a reimplementation of the GitHub Example code using this new structure.
let appReducer = Reducer(authenticationReducer, bookmarksReducer, repositoriesReducer)
let authenticationReducer = Reducer<State> { action, state in
var state = state
switch action {
case let action as SetOAuthURL:
state.authenticationState.oAuthURL = action.oAuthUrl
case let action as UpdateLoggedInState:
state.authenticationState.loggedInState = action.loggedInState
default:
break
}
return state
}
let bookmarksReducer = Reducer<State> { action, state in
var state = state
if let action = action as? CreateBookmark {
let bookmark = (route: action.route, routeSpecificData: action.routeSpecificData)
state.bookmarks.append(bookmark)
}
return state
}
let repositoriesReducer = Reducer<State> { action, state in
var state = state
if let action = action as? SetRepostories {
state.repositories = action.repositories
}
return state
}
from reswift.
from reswift.
from reswift.
@Qata agree that this looks nice! One thought: using only functions it's easy to compose reducers that operate on a substate of the overall state. E.g. in the GitHub example we only pass the bookmark state to the bookmark reducer. This enforces separation of concerns within reducers. Do you have an idea if/how this would be possible with your approach?
from reswift.
Finally opened #177, that serves the original request of making Reducer a function type. While I'm a big fan of @Qata suggestion of revamping the middleware API (#175). I think that having the reducer being a function type has advantages for composition that I mentioned above.
You can see an example here: https://github.com/ReSwift/GitHubBrowserExample/blob/master/SwiftFlowGitHubBrowser/Reducers/AppReducer.swift#L16-L19
from reswift.
Shipped with #177.
from reswift.
Related Issues (20)
- Migrate from Travis CI to GitHub Actions? HOT 2
- Concurrency - protected reads HOT 2
- How to subscribe/unsubscribe store in a UIView like in UITableViewCell, CollectionViewCell etc ? HOT 1
- What's a good way to cast results of a subscription in SwiftUI to a desired output type? HOT 3
- Managing ReSwift app state inside FileDocument HOT 1
- Remove Travis from all ReSwift repos? / How to set up GH Actions
- ReSwift 7 Roadmap HOT 20
- Docs: Update outdated and vulnerable jQuery version HOT 3
- Array as a State HOT 1
- Clarification on Single Store object for an application. HOT 1
- Change visibility of Store from 'open' to 'public final'? HOT 2
- SIGSEGV on state.didSet HOT 4
- Using Inject with ReSwift HOT 1
- Testing: Waiting for store.dispatch() to complete HOT 2
- Huge CPU gap between ReSwift Store vs just SwiftUI ObservableObject HOT 1
- Crash: sometimes will crash at this point, what can i do to find the root cause HOT 11
- Crash when dispatching actions from inside StoreSubscriber.newState() HOT 2
- How to use a state on recursive screens? HOT 4
- Filter on updates not working HOT 3
- When do you upgrade ReSwiftRouter ? Now๏ผReSwiftRouter just depends ReSwift 5.0.0, but lasted ReSwift is 6.1.1 HOT 2
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 reswift.