return tuple, not list

so the output can be memoized