Hi all,

I'm having a weird state problem with
Component<https://github.com/stuartsierra/component>.
Let's say I have a system component, like in fig.1. Starting / stopping and
loading state is fine.
However, let's say I have 2 other components (:updater , :reader) that use
component :a. This is the problem that occurs.

   1. When *:updater*, modifies an atom in *:a*, that change appears in
   path [*:core :a*], not path [*:updater :a*] or [*:a*].
   2. Because of the abouve, when *:reader* goes to it's local path [
   *:reader :a*] to read that change, it doesn't see those modifications.
   3. Using this scheme, *:a* is duplicated 4 times, in the system map.
   However, the modifications only appear in path [*:core :a*]. Thus
   :reader is unable to access it (it's local [*:a*] is unchanged).


(def system-components [:a :updater :reader])

(defrecord Core [env] component/Lifecycle
  (start [this] ...)
  (stop [this] ...))

(defn component-core [env]

  (component/system-map
   :a (component/using
          (ca/component-a env)
          {})
   :updater (component/using
         (cs/component-updater env)
         {:a :a})
   :reader(component/using
         (cs/component-reader env)
         {:a :a})
   :core (component/using
            (map->Foobar {:env env})
            {:a :a

             :updater :updater

             :reader :reader })))

*fig.1 *


I was hoping to use Component to manage all internal application state. But
maybe it's not designed for this use case (state changes between
components). I imagine that immutability is preventing all those duplicates
from seeing the modifications. However, in this case I do need an update to
:a in one component, to be accessed by another component.

Any suggestions on patterns here? I'm also looking at
component/update-system<https://github.com/stuartsierra/component/blob/master/src/com/stuartsierra/component.clj#L116>.
But again, I don't have access to the core *system* var, from within my
components.


Any insights appreciated

Tim Washington
Interruptsoftware.com <http://interruptsoftware.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