   [coll]
   (assert (seq coll) "elements cannot be called with an empty collection")
   (core/let [v (vec coll)]
-    (gen-bind (choose 0 (dec (count v)))
-              #(gen-pure (rose/fmap v %)))))
+    (gen-fmap #(rose/fmap v %)
+              (choose 0 (dec (count v))))))
 
 (defn- such-that-helper
   [pred gen {:keys [ex-fn max-tries]} rng size]

  applicable to the domain."
  [gen]
  (assert (generator? gen) "Arg to no-shrink must be a generator")
  (gen-bind gen
            (fn [rose]
              (gen-pure (rose/make-rose (rose/root rose) [])))))

(defn shrink-2
  "Create a new generator like `gen`, but will consider nodes for shrinking
  even if their parent passes the test (up to one additional level)."
  [gen]
  (assert (generator? gen) "Arg to shrink-2 must be a generator")
  (gen-bind gen (comp gen-pure rose/collapse)))

(def boolean
  "Generates one of `true` or `false`. Shrinks to `false`."

  (assert (generator? generator) "First arg to list must be a generator")
  (gen-bind (sized #(choose 0 %))
            (fn [num-elements-rose]
              (gen-fmap (fn [roses]
                          (rose/shrink-vector core/list
                                              roses))
                        (gen-tuple (repeat (rose/root num-elements-rose)
                                           generator))))))

(defn- swap
  [coll [i1 i2]]
