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

API for EnvironmentLess Stores #47

Closed
natemann opened this issue May 8, 2020 · 5 comments
Closed

API for EnvironmentLess Stores #47

natemann opened this issue May 8, 2020 · 5 comments

Comments

@natemann
Copy link
Contributor

natemann commented May 8, 2020

Following along with creating Stateless and Actionless viewStores in #43 , what are the thoughts on extending Store and Reducer with functions where Environment is Void? I am finding that for most stores, I don't need an Environment object.

I think it would be nice to have, but could bloat TCA quite a bit as you would have extensions for 3 possible scenarios:

  • Environment is Void
  • LocalEnvironment is void (for scopes)
    -GlobalEnvironment is void (for pullbacks)
@stephencelis
Copy link
Member

stephencelis commented May 8, 2020

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 to XyEnvironment (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

@natemann
Copy link
Contributor Author

natemann commented May 8, 2020

@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.

@stephencelis
Copy link
Member

I have a few reducers that don't have an environment, but still return an Effect. Mostly just the fireAndForget 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 write environment: { _ in () } in pullbacks and scopes.

Yup! I think those versions of pullback are definitely handy for reducers with Void environments.

@stephencelis
Copy link
Member

@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?

@natemann
Copy link
Contributor Author

Sure thing.

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

No branches or pull requests

2 participants