That makes sense. Thanks for the explanation.

On Tuesday, 2 June 2015, Timothy Baldridge <tbaldri...@gmail.com> wrote:

> 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
> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@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
>> <javascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@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
> <javascript:_e(%7B%7D,'cvml','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
> <javascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@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
> <javascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@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.

Reply via email to