On Tue, Jun 23, 2015 at 11:47 PM, James Henderson <ja...@jarohen.me.uk> 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). > > 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 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. > -- 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.