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 > <javascript:>> 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 >> <javascript:>> 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 >>> <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 >>> --- >>> 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/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 >> <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 >> --- >> 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/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.