use dash.el versions of *-let macros
use defun* instead of cl-defun for readability