An alternative that I'm looking at is pedestal 0.3.0. It sort of works like
this...
;; Create a transform-channel and transform-function to handle all changes
to 'state'
(defn init []
(let [c (chan)]
(go (while true
(when-let [[path v] (<! c)]
(swap! state assoc-in path v))))
c))
(def transform-chan (init))
(defn transform [path v]
(>! transform-chan [path v]))
;; Change the state by calling transform
(transform [athlete-number :active?] true)
(transform [athlete-number :timestamp] ms)
;; Create an inform-channel where functions can subscribe to changes in
'state'
(def inform-channel-subscriptions
[[update-timestamp [:* :timestamp]]
[update-active [:* :active?]]])
This approach is described in:
https://github.com/pedestal/pedestal/blob/master/app/examples/walkthrough.clj
On Friday, November 29, 2013 6:58:32 PM UTC+1, Sam Ritchie wrote:
>
> Hey guys,
>
> As I start to work on more Clojurescript UI code, I've been running into a
> pattern with atoms and watches that I THINK I can abstract away... but the
> solution feels wrong, and I'd love to hear a better way.
>
> Say I'm building a stopwatch for timing runners in a race. I've got a
> clojure record like this:
>
> (defrecord StopwatchState [
> active? ;; timer running?
> timestamp ;; UTC time of this particular state
> stopwatch-time ;; the time on the stopwatch as of "timestamp"
> results ;; pairs of [athlete number, time]])
>
> and a bunch of functions that toggle the timer, mark an athlete crossing
> the line, update the timer, etc.
>
> My view holds the current state in an atom:
>
> (def state (atom ,,some-stopwatch-state))
>
> and I update my views by adding watches to the atom and refreshing the
> various UI components to match the new state.
>
> Now! Here's the annoying pattern. In the cljs UI world, to poke these
> atoms, I end up wrapping all of my model functions like this:
>
> (defn toggle! []
> (swap! state toggle))
> (defn mark! [athlete-number]
> (swap! state mark athlete-number))
>
> I can think of two ways to break the pattern.
>
> 1) A deep-code-walking macro that transforms code like (mark state
> athlete-number) into (swap! state mark athlete-number) if the first
> argument is an atom;
> 2) a defstatefn macro that defines the "mark" and "mark!" versions at the
> same time.
>
> Both feel wrong. My goal is to program in a more declarative way. Is there
> a better way to structure UI code?
>
> --
> Sam Ritchie (@sritchie)
> Paddleguru Co-Founder
> 703.863.8561
> www.paddleguru.com
> Twitter <http://twitter.com/paddleguru> //
> Facebook<http://facebook.com/paddleguru>
>
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.