-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
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
Allow filters to take a Bundle
instead of a singular Component
, and make the conjunction behavior configurable
#15327
Comments
I expect this still to be controversial, but hopefully less so within the context we have today, and with (hopefully) all information centralized. |
I pretty like the idea of having a join mode on the filters to choose between "and" and "or". What about having the join mode before the tuple ?
With this fluent syntax we can "translate" I make a POC here. When you're saying "bundle" you mean structures that implement |
Having the conjunction as the first param makes the trivial case (single component) more verbose & is a breaking change. You can't do what you're suggesting because that requires specialization or negative trait bounds. Bundles aren't going to be deprecated at most they're going to be repurposed. |
I want to keep
I don't get where specialization or negative bounds are needed. If you look at the POC, only one parameter of the filter is generic and the other one is fixed. |
Ah ok you don't need it if you just have impls for each conjecture instead of a trait for conjectures. That would work & it wouldn't break existing filters. |
What problem does this solve or what need does it fill?
With the merging of #14791, bevy itself is moving away from the usage of
Bundle
structs as a means of adding many components to an entity at once, and recommends (but doesn't require that) ecosystem crates follow suit. Therefore,Bundle
s are more free to be used in other cases with less of a worry about introducing footguns, since they are being phased out from common usage (but not completely removed).The most immediate helpful place
Bundle
s would find usage in is filters:What solution would you like?
These filters:
Become:
The additional
Join
generic parameter specifies how the tuple conjunction is performed:All
:With<(A, B, C), All>
meansWith<A> AND With<B> AND With<C>
Any
:With<(A, B, C), Any>
meansWith<A> OR With<B> OR With<C>
We should determine if the default conjunction for
Without
should beAny
instead ofAll
.Note:
std::any::Any
already exists. We should try to find an alternative naming scheme that doesn't clash with std types or pre-existing bevy types, but we may have to resort to doing so anyways if no better alternative is found.What alternative(s) have you considered?
Bundle tuples only
To reduce controversy, #9255 proposed implementing
With<B: Bundle>
and other filters only forBundle
s made of tuples. I believe this to no longer be necessary asBundle
s are being phased out in favor of required components, so it's believed that developers will have less of a draw towards thinking in terms ofBundle
s (which would have been a poor-man's way of doing OOP).Conjunction-first
Previously suggested is a flipping of the filter type and conjunction type:
However that ran into issues with HKTs (higher kinded types), and is verbose in the single-component case.
Additional context
WithBundle
#2620With
andWithout
#9255The text was updated successfully, but these errors were encountered: