reader monad instead of arrows