   (cond-> tween
     (keyword? tween) tweens))
 
-(defn resolve-callback
-  "If the callback is a state path, create the callback to set that path."
-  [callback]
-  (if-let [path (when (vector? callback) callback)]
-    #(swap! state assoc-in path %)
-    callback))
-
 (defn animate!
   "Pass given animation values to the given callback.
    Returns a channel that closes when done."
-  [{:keys [a b duration tween] :or {tween :swing} :as opts} callback]
+  [{:keys [a b duration tween] :or {tween :swing} :as opts} state-path]
   (let [tween (resolve-tween tween)
-        callback (resolve-callback callback)
         c (chan)
+        resolve-var #(if (= % :_) (get-in @state state-path) %)
+        a (resolve-var a)
         dv (- b a)]
     (tap tick-tap c)
     (go-loop [t 0]

                 :es6 {:alpha 0}
                 :es7 {:alpha 0}
                 :es8 {:alpha 0}}
   })

;; Current state of the application.

                        (min 1)
                        (tween))
            v (+ a (* percent dv))]
        (swap! state assoc-in state-path v)
        (when (< t duration)
          (recur t)))
      (untap tick-tap c))))
