You can also use the alt! macro:
(let [stop (chan)]
(go (loop []
(println "Hello World!")
(alt!
(timeout 1000) (do (println "I'm done sleeping...")
(recur))
stop :ok)))
(<!! (timeout 10000))
(>!! stop :now)
(println "We're done."))
On Wednesday, July 17, 2013 10:31:50 PM UTC+3, David Nolen wrote:
>
> Why not the following?
>
> (let [stop (chan)]
> (go (loop []
> (println "Hello World!")
> (let [[v c]] (alts! [(timeout 10000) stop])]
> (if (= c stop)
> :done
> (do (println "I'm done sleeping, going to recur now...")
> (recur)))))))
>
>
> On Wed, Jul 17, 2013 at 2:47 PM, Ben Mabey <[email protected]<javascript:>
> > wrote:
>
>> Hi all,
>> In a number of places where I'm trying core.async I have run across the
>> pattern of having a loop inside a go block with some timeouts in the loop
>> body. Contrived example:
>>
>> (go
>> (while true
>> (println "Hello World!")
>> (<! (timeout 10000))
>> (println "I'm done sleeping, going to recur now...")))
>>
>> In situations like these I almost always want to be able to stop the loop
>> and prematurely stop the timeouts. Using alt! we can easily handle the
>> need of stopping the timeout. Stopping the overall loop is easy as well
>> but I can't seem to do it without the use of an atom. Here are some macros
>> I've come up with using a channel, an atom, and an additional go block:
>> https://gist.github.com/**bmabey/6023231<https://gist.github.com/bmabey/6023231>
>>
>> Is there a better way to do this that doesn't involve an atom? If we had
>> a `closed?` fn for channels one could write:
>>
>> (let [stop (chan)]
>> (go
>> (while (not (closed? stop))
>> (println "Hello World!")
>> (alts! [(timeout 10000) stop])
>> (println "I'm done sleeping, going to recur now...")))
>> stop)
>>
>> This seems ideal and a good use case for adding some sort of function to
>> detect termination. Thoughts?
>>
>> Thanks,
>> Ben
>>
>> --
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to [email protected]<javascript:>
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@**googlegroups.com <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>> --- You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojure+u...@**googlegroups.com <javascript:>.
>> For more options, visit
>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>> .
>>
>>
>>
>
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.