hate this third param. it’s extremely not typical to traversal functions to has it in other languages