 
           {:subtitle "put and take"
            :custom (PutAndTakeSlide. {:buffer-size 7 :font-size "72pt" :radius 50})}
+
+          {:subtitle "timeouts"
+           :custom (TimeoutSlide. {:buffer-size 5 :font-size "72pt" :radius 70})}
 
           {:title "Buffers"
            :code "(<! (chan))"}

   [om.dom :as dom :include-macros true]
   [sablono.core :as html :refer-macros [html]]
   [ankha.core :as ankha]
   [cljs.core.async :refer [<! >! buffer chan put! sliding-buffer close! pipe map< filter<]]
   [ajax.core :refer (GET POST)]))

(enable-console-print!)

                 :x 0 :y 0 :width 140 :height 100 :fill "black"}]
         [:text {:x 30 :y 80 :style {:font-size default-font :stroke "white" :fill "white"}} "<!"]]]])))

(defrecord TimeoutSlide [opts]
  Slide
  (init-slide-state [_]
    {:status "READY"})

  (render-slide [_ data owner]
    (let [bufsize (om/get-state owner :buffer-size)
          buf (om/get-state owner :buf)
          default-font (om/get-state owner :default-font)
          radius (om/get-state owner :radius)]
      [:div
       [:svg {:version "1.1" :width 800 :height 600}
        [:text {:x 30 :y 120 :style {:font-size default-font :stroke "white" :fill "white"}} (om/get-state owner :status)]
        [:g {:transform "translate(70,150)"
             :onClick (fn [_]
                        (om/set-state! owner :status "WAITING")
                        (go
                          (<! (timeout 2000))
                          (om/set-state! owner :status "CLOSED")))}
         [:rect {:x 0 :y 0 :width 280 :height 100 :fill "red"}]
         [:text {:x 30 :y 80 :style {:font-size default-font :stroke "white" :fill "white"}} "(timeout 2000)"]]]])))

(def app-model
  (atom {:current-slide 4
         :slides
         [{:title "core.async"
           :event "QCon 2014"
