I think the problem is more centered around push vs pull based APIs.
Callbacks, and core.async work quite well for push based apis (e.g. event
streams). Lazy seqs work on a pull basis. ZeroMQ has a pull API, so lazy
seqs work quite well there.

Also lazy-seqs aren't async. If you call (next ..) and the computation of
the next cell makes a network request, you've now blocked the current
thread waiting for a response.

Timothy

On Tue, Jun 2, 2015 at 10:15 AM, Gary Verhaegen <gary.verhae...@gmail.com>
wrote:

> I'm not sure I follow why lazyness cannot be asynchronous, as long as
> reads are blocking (which they are by default in core.async, I believe).
> Your description of the problem made me think of this blog post I read
> some years ago:
>
> http://oobaloo.co.uk/clojure-abstraction-and-zeromq
>
> which explains how to expose a stream of zeromq messages as a lazy seq, so
> that consuming code does not need to know about zeromq. It sounded similar,
> but maybe it's not.
>
>
> On Tuesday, 2 June 2015, Christopher Small <metasoar...@gmail.com> wrote:
>
>> Lazy seqs by themselves wouldn't work, since it needs to be asynchronous,
>> and it's always possible that when you ask for the next element, that there
>> won't have been any new events yet. I suppose that you could return a lazy
>> sequence of futures, which is interesting, but not particularly idiomatic.
>> At that point I'd rather just use core.async, because that's what it starts
>> to look like.
>>
>> On Tue, Jun 2, 2015 at 1:19 AM, Gary Verhaegen <gary.verhae...@gmail.com>
>> wrote:
>>
>>> Have you considered returning a lazy seq of events?
>>>
>>>
>>> On Tuesday, 2 June 2015, Christopher Small <metasoar...@gmail.com>
>>> wrote:
>>>
>>>>
>>>> Lots of great thoughts here; thanks so much for the feedback!
>>>>
>>>> It seems the general opinion so far leans towards keeping things
>>>> simple. I definitely resonate with this statement: "having to write
>>>> some glue code feels less frustrating than when libs make assumptions
>>>> that I don't like."
>>>>
>>>> Unfortunately, the abstractness of my question is allowing things to
>>>> drift a little further than I intended. So to ground things a bit, in my
>>>> particular use case promises wouldn't work because I need to allow for a
>>>> stream of events. Promises only let you capture a single event.
>>>>
>>>> Additionally, I feel it worth responding to some of Timothy's comments
>>>> about the difficulty of getting a core.async centric API "right". While I
>>>> agree that in general (and particular with more complicated APIs) getting
>>>> things right can be tricky, the situation I'm dealing with (I think) can be
>>>> dealt with quite simply. Imagine a stream of events coming in from The Real
>>>> World (TM), and that we'd like to process somehow. The solution I've been
>>>> chewing on is a function that let's us specify a single channel on which
>>>> events should be placed. The nice thing about this is that it assumes
>>>> almost nothing about how you'll use core.async, only that you'll be using
>>>> it. You can decide whether you want a buffer or not, whether it should drop
>>>> or slide or block/park, whether it should be tapped, etc.
>>>>
>>>> The potentially nice thing about core.async for this use case over
>>>> callbacks (as far as the implementation is concerned) is that should we
>>>> decide to stop listening to events, we can just close! the channel. This
>>>> can then serve as a signal to the underlying code/process actually reading
>>>> in events that it can stop. With callbacks, it will probably be necessary
>>>> to have something that manages these processes and listens for kill
>>>> signals, potentially complicating things quite a bit. (It's possible there
>>>> is an elegant solution here, and I haven't thought about it too much yet,
>>>> but this is my current intuition...)
>>>>
>>>> I should also mention that Manifold did come to mind for this project,
>>>> and it's something I'll probably look at and consider again. Thanks for
>>>> bringing it up.
>>>>
>>>> Please continue to share your thoughts given all this :-)
>>>>
>>>> With gratitude
>>>>
>>>> Chris
>>>>
>>>>
>>>>
>>>> On Monday, June 1, 2015 at 10:18:46 PM UTC-7, Leonardo Borges wrote:
>>>>>
>>>>> For people interested in using the 'futures' approach, this might be
>>>>> of interest: https://github.com/leonardoborges/imminent
>>>>>
>>>>>
>>>>> It's a library that implements composable futures for Clojure on top
>>>>> of JVM's ForkJoin framework. It allows you to attach callbacks as well as
>>>>> apply combinators such as map etc...
>>>>>
>>>>>
>>>>> On 2 Jun 2015 3:04 pm, "Timothy Baldridge" <tbald...@gmail.com> wrote:
>>>>>
>>>>>> The problem with futures is that you can't attach callbacks to them,
>>>>>> you can only block a thread waiting on them. So futures interface quite
>>>>>> poorly with async libraries, hence the reason core.async was created in 
>>>>>> the
>>>>>> first place.
>>>>>>
>>>>>> Core.async is a dependency, but it's hardly one that changes fast.
>>>>>> The last breaking change was about a year and a half ago (Jan 2014).
>>>>>> Besides that, all changes are additional "opt-in" features. That's a lot
>>>>>> less change than most libraries in the Clojure ecosystem.
>>>>>>
>>>>>> Timothy
>>>>>>
>>>>>> On Mon, Jun 1, 2015 at 10:42 PM, Stanislav Yurin <jus...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> As for the core.async, I think it is too personal and has too much
>>>>>>> raw power, to be all that restricted in some logical bottleneck upon
>>>>>>> results return from the third-party lib.
>>>>>>> Not counting the fact it is a (a) dependency that (b) changes fast.
>>>>>>>
>>>>>>> On Monday, June 1, 2015 at 10:18:19 PM UTC+3, Christopher Small
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Greetings
>>>>>>>>
>>>>>>>> I imagine most of us here would rather use core.async channels over
>>>>>>>> callbacks in their application code, particularly with more complicated
>>>>>>>> applications. But is it okay/preferable for Clojure libraries to force
>>>>>>>> their users to use core.async channels as part of an API (an event 
>>>>>>>> channel,
>>>>>>>> for example)?
>>>>>>>>
>>>>>>>> As much as I love core.async, I can't help but wonder whether
>>>>>>>> sticking with callbacks for an API isn't a simpler/better design 
>>>>>>>> strategy.
>>>>>>>> It's easy enough to drop messages on a channel in a callback, and this
>>>>>>>> let's users opt-in. But if one expects core.async channels are what 
>>>>>>>> most
>>>>>>>> would prefer anyway, is it okay to foist them upon everyone?
>>>>>>>>
>>>>>>>> As a follow up, does your opinion on the matter change if
>>>>>>>> implementations of an API become simpler using core.async channels?
>>>>>>>>
>>>>>>>>
>>>>>>>> Looking forward to your thoughts :-)
>>>>>>>>
>>>>>>>> Chris Small
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> PS I'm asking because I'm working on a physical computing API (
>>>>>>>> https://github.com/clj-bots/pin-ctrl) and debating between using
>>>>>>>> channels vs callbacks for the edge detection functionality (if you're 
>>>>>>>> not
>>>>>>>> familiar, edge detection let's you asynchronously handle changes in pin
>>>>>>>> state, such as button pushes). If you're interested in this question 
>>>>>>>> as it
>>>>>>>> applies specifically to this application, feel free to join the 
>>>>>>>> discussion
>>>>>>>> on our gitter channel: https://gitter.im/clj-bots/chat
>>>>>>>>
>>>>>>>  --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "Clojure" group.
>>>>>>> To post to this group, send email to clo...@googlegroups.com
>>>>>>> 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
>>>>>>> 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 clojure+u...@googlegroups.com.
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> “One of the main causes of the fall of the Roman Empire was
>>>>>> that–lacking zero–they had no way to indicate successful termination of
>>>>>> their C programs.”
>>>>>> (Robert Firth)
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Clojure" group.
>>>>>> To post to this group, send email to clo...@googlegroups.com
>>>>>> 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
>>>>>> 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 clojure+u...@googlegroups.com.
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>   --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clojure@googlegroups.com
>>>> Note that posts from new members are moderated - please be patient with
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+unsubscr...@googlegroups.com
>>>> 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 clojure+unsubscr...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clojure@googlegroups.com
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+unsubscr...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/group/clojure?hl=en
>>> ---
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "Clojure" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/clojure/nuy2CAA89sI/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> clojure+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clojure@googlegroups.com
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+unsubscr...@googlegroups.com
>> 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 clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>  --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> 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 clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
“One of the main causes of the fall of the Roman Empire was that–lacking
zero–they had no way to indicate successful termination of their C
programs.”
(Robert Firth)

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to