add arbitrary zip func