copy() ran on every state update (each drag-select step included) and eagerly
recomputed five derived properties: two unused O(N log N) sorts, an O(N)
selection filter, an O(N) selectable-URI set and its containsAll check.
- Remove sortedPhotos/sortedSubfolders: never read (the screen sorts with its
own remember() calls)
- selectedPhotos/selectablePhotoUris/allPhotosSelected become by lazy:
computed at most once per instance, only when actually read; body delegates
stay out of generated copy()/equals(), @Immutable semantics hold
- Memoize selectablePhotoUris across drag-select steps in the ViewModel keyed
by photos list identity, so a drag step no longer recomputes the O(N) set