              (fn [show snapshot]
                (swap! active (fn [fx] () (filterv #(not (end % show snapshot)) fx)))
                (empty? @active)))))
+
+(defn blank
+  "Create an effect which does nothing. This can be useful, for
+  example, when you want to use [[fade]] to fade into an effect from a
+  state where there was simply nothing happening."
+  []
+  (scene "Blank"))
 
 (defmulti fade-between-assignments
   "Calculates an intermediate value between two attribute assignments

  the way Afterglow evaluates assigners, that means that if any
  constituent effects try to assign to the same target, the later ones
  will have a chance to override or blend with the earlier ones."
  [scene-name & effects]
  (let [active (atom effects)]
    (Effect. scene-name

                     (map (fn [k]
                            (let [from-assigners (get from-groups k)
                                  to-assigners (get to-groups k)
                                  template (or (first from-assigners) (first to-assigners))
                                  f (fn [show snapshot target previous-assignment]
                                      (let [from (with-default-assignment
                                                   (run-assigners show snapshot from-assigners previous-assignment)
                                                   template previous-assignment)
                                            to (with-default-assignment
                                                 (run-assigners show snapshot to-assigners previous-assignment)
                                                 template previous-assignment)]
                                        (:value (fade-assignment from to v show snapshot))))]
                              (map->Assigner (assoc template :f f))))
                          keys)))))
             end-immediately)))
