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

How do if(<expression>) guard patterns interact with array/object pattern caches? #321

Open
gibson042 opened this issue Mar 18, 2024 · 4 comments

Comments

@gibson042
Copy link
Contributor

Consider the following:

function* makeIterable() {
  yield 1;
}
match({ iterable: makeIterable() }) {
    when let subject and { iterable: let iter } and iter is [1] and if(subject.iterable is [1]): console.log("fully cached");
    when { iterable: let iter } and iter is [1] and if(iter is [1]): console.log("partially cached");
    default: console.log("uncached");
}

What will be logged—"fully cached" because the if expression uses the cached results for both getting subject.iterable and for getting an iterator for that, "partially cached" because the if expression does not use cached results for the first Get but still remembers results from the iterator, or "uncached" because e.g. the if expression is independent of caching?

@ljharb
Copy link
Member

ljharb commented Mar 18, 2024

I would expect "fully cached" - any implicit iteration done by patterns should be populating and using the cache.

@ljharb
Copy link
Member

ljharb commented Sep 6, 2024

On a rethink, it wouldn't make any sense to do this - I think the if part is "just javascript" and the caching doesn't apply there. If you want the cache, use a binding in the pattern.

@gibson042
Copy link
Contributor Author

Does your rethink lead you to "partially cached" or to "uncached"?

@ljharb
Copy link
Member

ljharb commented Sep 7, 2024

Uncached. Caching only applies in patterns.

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