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

[for CI] Generic tuples improvements #20285

Draft
wants to merge 66 commits into
base: main
Choose a base branch
from

Conversation

EugeneFlesselle
Copy link
Contributor

Duplicate of dotty-staging#41 just to run the CI

New methods: filter, indicesWhere, reverseOnto
Also, add deep matches to tests
This is a general improvement, independent of named tuples.
Use the sugared representation, not the raw NamedTuple type tree.
Subclasses of Selectable can instantiate Fields to a named tuple type
that provides possible selection names and their types on instances of the type.

See: https://contributors.scala-lang.org/t/expanding-changing-selectable-based-on-upcoming-named-tuples-feature/6395/5
I usually try to avoid explicit returns, but here they do make the
code easier to read.
The selectDynamic call could already have influenced type variables
in the expected type before we wrap it in a cast.

Need to pass in the right expected type to the typedDynamicSelect.
NamedTyple.From should be the identity for named tuple arguments
odersky and others added 24 commits April 24, 2024 18:50
We need to go through an explicit pattern match to drop the names.
The pattern matcher selects tuples up to 22 using _1, _2, ... But if the scrutinee is a named
tuple this only works if it is cast to a regular tuple first.
as is the case for `Concat`
to only require being defined on the element types.
Similar to what we have for `type FlatMap`
This is for the same reason as we changed
`type Head[X <: NonEmptyTuple] = ...` to
`type Head[X <: Tuple] = ...`

Also, this is no more unsafe than the other operations already defined for all tuples.
`drop(1)` for example was always defined, even though `tail` wasn't.
* constant `true`.
*/
inline def filter[This >: this.type <: Tuple, P[_ <: Union[This]] <: Boolean]: Filter[This, P] =
val toInclude = constValueTuple[IndicesWhere[This, P]].toArray
Copy link
Member

@bishabosha bishabosha May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess to answer your question about runtime performance you could have an unrolled loop over erasedValue[IndicesWhere[This, P]] where you directly assign the arr(i)

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

Successfully merging this pull request may close these issues.

None yet

3 participants