The result set mechanism was ill-suited for iteration over lists. Converting it into a class and inverting it by pushing rows into the result set instead the result set asking for rows makes it very easy to use with lists. It also solves some of the consistency problems that existed with the previous implementation.