For a given execution, return the EvalCache before the future is executed, and a Future of the result, counters, and cache after This takes care of merging the input cache with cache in the future result, so you don't need to worry about that (but it wouldn't be an error to add something to the cache twice clearly).