 ;; Method implementations of `render`
 ;;
 
+(defmethod render `s/and [frame _ printer x]
+  (visit/visit (pop-trace printer) x))
+
+(defmethod render `s/or [frame _ printer x]
+  (visit/visit (pop-trace printer) x))
+
+(defmethod render `s/nilable [frame _ printer x]
+  (visit/visit (pop-trace printer) x))
+
 (defn- pretty-coll [printer open xs sep close f]
   (let [xform (comp (map-indexed #(f printer %1 %2))
                     (interpose sep))

  (render-every-kv frame printer x))

(defmethod render `s/keys [{[key] :steps :as frame} _ printer x]
  (render-coll frame printer x
    (fn [i [k v]]
      (let [vprinter (cond-> printer (= k key) pop-trace)]
        [:span (visit/visit printer k) " " (visit/visit vprinter v)]))))

(defmethod render `s/cat [frame _ printer x]
  (render-coll frame printer x))


(defmethod render `s/+ [frame _ printer x]
  (render-coll frame printer x))

(defmethod render `s/multi-spec [frame _ printer x]
  (visit/visit (pop-trace printer) x))

(defmethod render `s/nonconforming [frame _ printer x]
  (visit/visit (pop-trace printer) x))
