;; store (defn find-by-id [id] {}) (defn find-friends-of [id] []) (defn find-last-post-of [id] {}) ;; core (defn user [service id] (service id)) (defn friends [service id] (service id)) (defn last-post-of [service id] (service id)) (defn user+friends+last-post [user-service friends-service last-post-service id] (let [user (user-service id) friends (friends-service id) friends+last-posts (map #(assoc % :post (last-post-service (:id %))) friends)] (assoc user :friends friends+last-posts))) ;; public (def user (partial user find-by-id)) (def friends (partial friends find-friends-of)) (def last-post-of (partial last-post-of find-last-post-of)) (def user+friends+last-post (partial user+friends+last-post find-by-id find-friends-of find-last-post-of)) ;; client (user 1) (friends 1) (last-post-of 2) (user+friends+last-post 1)