On Wednesday, 24 June 2015 11:17:41 UTC+1, Atamert Ölçgen wrote: > > > > On Tue, Jun 23, 2015 at 11:47 PM, James Henderson <ja...@jarohen.me.uk > <javascript:>> wrote: > >> Hi Atamert - thanks :) >> >> I thought it might be preferable to keep the call to (latch)explicit - >> it means that ylet can be used in nested calls, too - for example, to >> set up and compose groups of components/sub-systems: (contrived example, >> though!) >> >> ;; (docs for ylet at >> https://github.com/james-henderson/yoyo#introducing-ylet ) >> >> (require '[yoyo :refer [ylet]]) >> >> (defn with-connections [config f] >> (ylet [db-pool (with-db-pool (:db config)) >> es-conn (with-es-connection (:elasticsearch config))] >> >> (f {:db-pool db-pool >> :es-conn es-conn}))) >> >> (defn make-system [latch] >> (let [config ...] >> (ylet [connections (with-connections system) >> _ (with-webserver {:handler (make-handler (merge connections >> {:config >> config})) >> :port 3000})] >> (latch)))) >> >> >> How would you see the with-* functions working, btw? >> > > I think the general idea should be to provide a clean API to the consumer > (of your lib). Perhaps something that accepts a start function, a stop > function and some sort of main loop (f in your example). >
Not sure I understand what you mean here? Tbh, I was trying to get away from the idea of separate start & stop functions - it seems 'cleaner' to me without them! (although of course that's subjective). Also, the 'with-*' functions here are consumer code - the only Yo-yo functions/macros in this example are 'run-system!' and 'ylet'. Yo-yo itself is *tiny* (<100 LoC) - my aim was for a library that solely dealt with starting/stopping a provided system, and *no more* :) Maybe it'd be worth fleshing out an example of what you were looking for? Cheers, James > >> >> Cheers, >> >> James >> >> On Tuesday, 23 June 2015 09:57:16 UTC+1, Atamert Ölçgen wrote: >>> >>> Hi James, >>> >>> Interesting idea. Thanks for sharing. >>> >>> I think you can simplify this: >>> >>> (yoyo/run-system! >>> (fn [latch] >>> (ylet [db-pool (with-db-pool {...}) >>> :let [server-opts {:handler (make-handler {:db-pool db-pool}) >>> :port 3000}] >>> web-server (with-web-server server-opts)] >>> (do-this web-server) >>> (do-that db-pool web-server) >>> (latch)))) >>> >>> >>> to: >>> >>> (yoyo/foo! [db-pool (with-db-pool {...}) >>> :let [server-opts {:handler (make-handler {:db-pool db-pool}) >>> :port 3000}] >>> web-server (with-web-server server-opts)] >>> (do-this web-server) >>> (do-that db-pool web-server)) >>> >>> >>> I believe with-* function can also be simplified further. >>> >>> >>> On Tue, Jun 23, 2015 at 1:18 AM, James Henderson <ja...@jarohen.me.uk> >>> wrote: >>> >>>> Hi all, >>>> >>>> I've just released an early version of 'Yo-yo', a protocol-less, >>>> function composition-based alternative to Component. It's still in its >>>> early stages, so feedback would be very much appreciated! >>>> >>>> https://github.com/james-henderson/yoyo >>>> >>>> Yo-yo was also an experiment to see what could be de-coupled from the >>>> concept of 'reloadable systems', so you won't find any configuration, >>>> dependency injection, etc - just a way to write a system that can be >>>> easily >>>> started, stopped, and reloaded. >>>> >>>> Fundamentally, we start by assuming there's a function available that >>>> only returns 'when the system stops' - a 'latch', say. If we had such a >>>> function, we could start our system, call that function, then stop the >>>> system (closing any necessary resources). A database pool, for example, >>>> might look like this: >>>> >>>> (defn with-db-pool [db-config f] >>>> (let [db-pool (start-pool! db-config)] >>>> (try >>>> (f db-pool) >>>> >>>> (finally >>>> (stop-pool! db-pool))))) >>>> >>>> Here, we're assuming that we'll be passed 'f', the 'latch' function. A >>>> web server would be similar, and, because they're both functions, they're >>>> very simple to compose: >>>> >>>> (with-db-pool {...} >>>> (fn [db-pool] >>>> (with-web-server {:handler (make-handler {:db-pool db-pool}) >>>> :port ...} >>>> (fn [web-server] >>>> ;; TODO: Ah. We've run out of turtles. :( >>>> )))) >>>> >>>> This is where Yo-yo comes in - there’s a function called run-system!, >>>> which takes a function that accepts a latch: >>>> >>>> (:require [yoyo]) >>>> >>>> (yoyo/run-system! >>>> (fn [latch] >>>> (with-db-pool {...} >>>> (fn [db-pool] >>>> (with-web-server {:handler (make-handler {:db-pool db-pool}) ; >>>> n.b. we have access to the db-pool here - no need for global state! >>>> :port ...} >>>> (fn [web-server] >>>> (latch))))))) ; Aha! >>>> >>>> run-system! then returns a promise - deliver any value to it, and >>>> it'll stop the system. >>>> >>>> And that's pretty much it! There are a few more functions - mostly to >>>> do with easily starting/stopping/reloading a system through the REPL, and >>>> a >>>> macro to simplify the 'function staircase' - these are covered in more >>>> detail in the README. There are some also common components - a database >>>> pool, a web server, and a simple integration for existing Component >>>> systems. >>>> >>>> It'd be great to hear your thoughts/ideas, whatever they may be - >>>> either through here, e-mail, Github, or Twitter - thanks! >>>> >>>> James >>>> >>>> -- >>>> 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. >>>> >>> >>> >>> >>> -- >>> Kind Regards, >>> Atamert Ölçgen >>> >>> ◻◼◻ >>> ◻◻◼ >>> ◼◼◼ >>> >>> www.muhuk.com >>> >> -- >> 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. >> > > > > -- > Kind Regards, > Atamert Ölçgen > > ◻◼◻ > ◻◻◼ > ◼◼◼ > > www.muhuk.com > -- 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.