abstract iteration