updated with new monads for return and assign