If we did want to optimize this, wouldn't the way be to have one function that returns a listing of applications and another function that returns the full in-memory representation of a given application? The nit wouldn't restrict the optimizations to be tied to sequential access (in fact, the one existing optimization we have is based on caching and not tied to sequential access at all).

The offset is also a bit weird to have here because it implies an ordering, but there isn't any discussion of how the ordering is defined and whether it should be stable over time.

Anyways, why not just keep this simple rather than make it more clunky for some optimization we didn't even write yet?