add deep first impl