You need to store your model in a ref-type (atom,agent,or ref), and
attach a watcher on it (a fn which is responsible for updating the
view). Now, 'mutating' your model will trigger a View update...piece of
cake :)
example:
(def board-history
"Log of the state of a game."
(atom []))
(defn log-board
"The logging function for the board ref. Will conj every new board-state
into a vector."
[dest k r old n]
(when-not (= n old)
(swap! dest conj n)))
(def current-chessItems
"This is list that keeps track of moving chess pieces. Is governed by an
atom and it changes after every move.
All changes are being logged to 'board-history'. Starts off as nil but
we can always get the initial board arrangement from core."
(-> (atom nil)
(add-watch :log (partial core/log-board core/board-history)))))
HTH,
Jim
ps: my example does not involve GUI, but you get the idea...it it
trivial to change the code so that it 'repaints' the canvas with the new
board instead of conjing it....
On 09/03/13 14:11, edw...@kenworthy.info wrote:
So I understand that Clojure's data structures are immutable but I am
not clear how that works with MVC.
So I have a view that displays a model. Other processes change that
model and the View presents those changes.
However it's not clear to me how that would work with an immutable model.
Obviously I can't pass the model into the View, have the view store a
reference to it and each time it's called on to render the model, do
so. The model is immutable.
So I could have a global variable which points to the model, and
whenever I 'change' the model I re-point it to the updated version.
Obviously the view would have to reference that global. This just
smells bad. And would get worse for each model and view you needed in
your application.
I suppose you could maintain some global map of models, but that
doesn't look nice either, it's not that much different from having a
pile of global models.
This must be a solved problem surely? Could someone point me to the
solution please? Swing or Quil based would be fine but I assume it
must be generally applicable.
--
--
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/groups/opt_out.
--
--
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/groups/opt_out.