   (gen* [_ _ _ _] (if gfn
                     (gfn)
                     (gen/gen-for-pred pred)))
-  (with-gen* [_ gfn] (->Type form pred gfn info))
-  (describe* [_] `(spec-tools.core/type ~form ~info))
+  (with-gen* [this gfn] (assoc this :gfn gfn))
+  (describe* [this]
+    (let [info (extra-type-map this)]
+      (if (seq info)
+        `(spec-tools.core/type ~form ~info)
+        `(spec-tools.core/type ~form))))
   IFn
   #?(:clj  (invoke [_ x] (pred x))
      :cljs (-invoke [_ x] (pred x)))

(defprotocol TypeLike
  (type-like [this]))

(declare ->Type)

(defrecord Type [form pred gfn info]
  #?@(:clj
      [s/Specize
       (specize* [s] s)

(ns spec-tools.core
  (:refer-clojure :exclude [type any? some?
                            number? integer? int? pos-int? neg-int? nat-int? float? double?
                            boolean? string? ident? simple-ident? qualified-ident?
                            keyword? simple-keyword? qualified-keyword? symbol? simple-symbol? qualified-symbol?
                            uuid? uri? bigdec? inst? seqable? indexed? map? vector? list? seq? char? set?
                            nil? false? true? zero? rational? coll? empty? associative? sequential? ratio? bytes?])
  #?(:cljs (:require-macros [spec-tools.core :refer [type]]))
  (:require
    [clojure.spec :as s]
