;; Copyright (c) Russ Olsen, Nicola Mometto, Rich Hickey & contributors. ;; The use and distribution terms for this software are covered by the ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) ;; which can be found in the file epl-v10.html at the root of this distribution. ;; By using this software in any fashion, you are agreeing to be bound by ;; the terms of this license. ;; You must not remove this notice, or any other, from this software. (ns cljs.tools.reader.impl.inspect) (declare inspect*) (defn- inspect*-col [truncate col start end] (let [n (count col) l (if truncate 0 (min 10 n)) elements (map (partial inspect* true) (take l col)) content (apply str (interpose " " elements)) suffix (if (< l n) "...")] (str start content suffix end))) (defn- dispatch-inspect [_ x] (cond (nil? x) :nil (string? x) :string (keyword? x) :strable (number? x) :strable (symbol? x) :strable (vector? x) :vector (list? x) :list (map? x) :map (set? x) :set (= x true) :strable (= x false) :strable :default (type x))) (defmulti inspect* dispatch-inspect) (defmethod inspect* :string [truncate ^String x] (let [n (if truncate 5 20) suffix (if (> (.-length x) n) "...\"" "\"")] (str \" (.substring ^String x 0 (min n (.-length x))) suffix))) (defmethod inspect* :strable [truncate x] (str x)) (defmethod inspect* cljs.core/IndexedSeq [truncate x] "") (defmethod inspect* cljs.core/PersistentArrayMapSeq [truncate x] "") (defmethod inspect* cljs.core/NodeSeq [truncate x] "") (defmethod inspect* cljs.core/Cons [truncate x] "") (defmethod inspect* cljs.core/LazySeq [truncate x] "") (defmethod inspect* :nil [_ _] "nil") (defmethod inspect* :list [truncate col] (inspect*-col truncate col \( \))) (defmethod inspect* :map [truncate m] (let [len (count m) n-shown (if truncate 0 len) contents (apply concat (take n-shown m)) suffix (if (> len n-shown) "...}" \})] (inspect*-col truncate contents \{ suffix))) (defmethod inspect* :set [truncate col] (inspect*-col truncate col "#{" \})) (defmethod inspect* :vector [truncate col] (inspect*-col truncate col \[ \])) (defmethod inspect* :default [truncate x] (pr-str (type x))) (defn inspect "Return a string description of the value supplied. May be the a string version of the value itself (e.g. \"true\") or it may be a description (e.g. \"an instance of Foo\"). If truncate is true then return a very terse version of the inspection." ([x] (inspect* false x)) ([truncate x] (inspect* truncate x)))