You should be able to add a parameter to the watch function which will be the result of the watched thing, avoiding the need to re-eval the collection again:
`scope.$watch( function() { return valuesFn( scope ); }, function( collection ) {`.

I actually think the perf of the re-eval once you've cached the `valuesFn` is very good so I won't let that hold up the PR  if you're happy with it.