   (gen/set (gen-id ctx) {:max-elements (:n ctx)}))
 
 
+(defn- gen-record
+  [ctx]
+  (gen/fmap
+    (fn [[id data]]
+      (assoc data :id id))
+    (gen/tuple
+      (gen-id ctx)
+      (gen-some-map
+        :a gen/large-integer
+        :b gen/boolean
+        :c (gen/scale #(/ % 10) gen/string)
+        :d (gen/double* {:NaN? false, :infinite? false})))))
+
+
 (defn- gen-range-query
   [ctx]
   (let [n+ (+ (:n ctx) 10)]


  (gen-args
    [ctx]
    [(gen/vector
       (gen/fmap
         (fn [[id data]]
           (assoc data :id id))
         (gen/tuple
           (gen-id ctx)
           (gen-some-map
             :a gen/large-integer
             :b gen/boolean
             :c (gen/scale #(/ % 10) gen/string)
             :d (gen/double* {:NaN? false, :infinite? false})))))])

  (apply-op
    [this table]

    (is (valid? ::table/node-data result))))


(defop Assoc
  [k v]

  (gen-args
    [ctx]
    [(gen/elements (:table-attrs ctx))
     (gen/one-of [gen/boolean gen/large-integer gen/keyword])])

  (apply-op
    [this table]
    (swap! table assoc k v))

  (check
    [this model result]
    (is (valid? ::table/node-data result))
    (is (= v (get result k)))))


(defop Dissoc
  [k]

  (gen-args
    [ctx]
    [(gen/elements (:table-attrs ctx))])

  (apply-op
    [this table]
    (swap! table dissoc k))

  (check
    [this model result]
    (is (valid? ::table/node-data result))
    (is (not (contains? result k)))))


(def ^:private op-generators
