initial version with operational monads