 ;; Keyword
 ;; ---------------------------------------------------------------------------
 
-(def keyword (fmap clojure.core/keyword
-                   (such-that string-alpha-numeric #(not= "" %))))
+(def keyword
+  "Generate keywords"
+  (fmap clojure.core/keyword
+        (such-that string-alpha-numeric #(not= "" %))))
 
 (defn shrink-keyword
   [k]

;; ---------------------------------------------------------------------------

(defprotocol Shrink
  (shrink [this]))

(defn fmap
  "NOTE: since `gen` is a function, this is just equivalent
  to `comp`. Perhaps using fmap will be more confusing to people?"
  [f gen]
  [:gen (fn [rand-seed size]
          (f (call-gen gen rand-seed size)))])

(defn bind
  [gen k]
  [:gen (fn [rand-seed size]
          (let [value (call-gen gen rand-seed size)]
            (call-gen (k value) rand-seed size)))])

(defn return
  [val]
  [:gen (fn [rand-seed size] val)])


    (- )))

(defn choose
  "Create a generator that returns numbers in the range
  `min-range` to `max-range`"
  [min-range max-range]
  (let [diff (Math/abs (- max-range min-range))]
    [:gen (fn [rand-seed _size]
