loop abstraction