@dazld you don't actually need a stop channel - if you use a channel you should be checking if it is closed, and that should be an exit condition from your loop
also, binding the go-loop to _ is strange, because you could just move it into the let body (let has an implicit do, accepting any number of forms for side effects
also, there's no way for anything to use the vals that get accumulated
with a small refactor, you could return them when stop is invoked
also, if action
is blocking or CPU intensive, you should use core.async/thread
and then use <!
to park on the thread's completion