 (defn make-rain-effect
   [layer-id vw vh]
   (let [rain-state (repeat vh (vec (repeat vw nil)))]
-    (fn [terminal]
-      (RainEffect. terminal layer-id rain-state))))
+    (map (fn [rain-state]
+           [33 {:layer-id layer-id
+                :characters (for [[y line] (map-indexed vector rain-state)
+                                  [x cell] (map-indexed vector line)
+                                  :when cell]
+                              (rain-cell-char x y cell))}])
+         (iterate #(step-rain % vw vh) rain-state))))
+    #_(fn [terminal]
+      (RainEffect. terminal layer-id rain-state))
 
 (defrecord TransformEffect
   [terminal layer-id ch from to duration]

  ACmdStream
  (stream [this]
    (go-loop [x (first s) xs (next s)]
      (doseq [[_ {:keys [layer-id]}] x]
        (zat/clear! terminal layer-id))
      (let [[dt {:keys [layer-id characters]}] x]
        (zat/put-chars! terminal layer-id characters)

  ([layer-id characters]
    (make-blink-effect layer-id characters true))
  ([layer-id characters initial]
    (make-blink-effect layer-id characters initial (repeat 1000)))
  ([layer-id characters initial intervals]
    (map vector intervals (interleave (repeat {:layer-id layer-id :characters []})
                                      (repeat {:layer-id layer-id :characters characters})))))
    ;(BlinkEffect. terminal layer-id characters initial intervals))))

(defn make-blip-effect
  [layer-id characters duration]
