abstraction on 'Counter' type so that the monad can't be 'escaped'