Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR #2588 has shown that there's a missing element in the optics hierarchy: folds focus on 0..N, getters focus on exactly 1, so we are missing something which focuses on 0..1. This is
OptionalGetter
, the "get" part ofOptional
andPrism
. In other libraries this is called anAffineFold
. However, I find that name very obscure. Feel free to suggest changes.In particular, the operation of filtering is one such
OptionalGetter
. The implementation is a copy of the one provided by @lenguyenthanh in #2588 (thank you for that!).A technical note: you may notice that it is not the case that
Getter<S, A>
extendsOptionalGetter<S, A>
. This is because the right way to describe the relation is thatGetter<S, A>
is aPOptionalGetter<S, T, A>
for any choice ofT
(since it never returns it). Alas, Kotlin does not allow us to declare that relationship. One way to handle this would be to use something likeOptionalGetter<S, Nothing, A>
, but unfortunately theT
must be invariant :(