   (fn [explain-data]
     (print (printer-str opts explain-data))))
 
+(s/fdef printer
+        :args (s/cat :explain-data map?)
+        :ret nil?)
 (defn printer
-  "Prints explain-data in a human-readable format"
+  "Prints `explain-data` in a human-readable format"
   [explain-data]
   ((custom-printer {}) explain-data))
 
+(s/fdef expound-str
+        :args (s/cat :spec :expound.spec/spec
+                     :form any?)
+        :ret string?)
 (defn expound-str
-  "Given a spec and a value, either returns success message or returns a human-readable explanation as a string."
+  "Given a `spec` and a `form`, either returns success message or returns a human-readable explanation as a string."
   [spec form]
   ;; expound was initially released with support
   ;; for CLJS 1.9.542 which did not include

                                       :expound.printer/value-str-fn
                                       :expound.printer/print-specs?
                                       :expound.printer/theme]))

;;;;;; themes ;;;;;;


;;;;;; internal specs ;;;;;;

(s/def ::singleton (s/coll-of any? :count 1))
;; TODO - rename within expound namespace, I can't take top-level spec namespace
;; (s/def :spec/spec keyword?)
;; (s/def :spec/specs (s/coll-of :spec/spec))
;; (s/def :spec.problem/via (s/coll-of :spec/spec :kind vector?))
;; (s/def :spec/problem (s/keys :req-un [:spec.problem/via]))
;; (s/def :spec/problems (s/coll-of :spec/problem))

(s/def :expound.printer/show-valid-values? boolean?)
(s/def :expound.printer/value-str-fn ifn?)
