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 > <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.