   (sized (fn [size] (choose (- size) size))))
 
 (def nat
+  "Generates natural numbers, starting at zero. Shrinks to zero."
   (fmap #(Math/abs (long %)) int))
 
 (def pos-int

  (let [input (vector (tuple key-gen val-gen))]
    (fmap (partial into {}) input)))

(defn hash-map 
  "Like clojure.core/hash-map, except the values are generators.
   Returns a generator that makes maps with the supplied keys and 
   values generated using the supplied generators."
  [& kvs]
  (assert (even? (count kvs)))
  (let [ks (take-nth 2 kvs)

          (recur rand-seed (inc size)))))))

(def not-empty
  "Modifies a generator so that it doesn't generate empty collections.

  Examples:

      ;; generate a vector of booleans, but never the empty vector
      (gen/not-empty (gen/vector gen/boolean))
  "
  (partial such-that clojure.core/not-empty))

(def boolean
  "Generates one of `true` or `false`. Shrinks to `false`."
  (elements [false true]))

(defn tuple
  "Create a generator that returns a vector, whose elements are chosen
  from the generators in the same position. The individual elements shrink
  according to their generator, but the value will never shrink in count.

  Examples:

