add some functional tools like curry and compose