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

Reply via email to