Skip to content

Commit 45b6769

Browse files
committed
Add IOverride cache
Closes #87
1 parent a4cb207 commit 45b6769

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

src/fipp/edn.cljc

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"Provides a pretty document serializer and pprint fn for Clojure/EDN forms.
33
See fipp.clojure for pretty printing Clojure code."
44
(:require [clojure.string :as str]
5-
[fipp.ednize :refer [edn record->tagged]]
5+
[fipp.ednize :refer [edn record->tagged IOverride]]
66
[fipp.visit :refer [visit visit*]]
77
[fipp.engine :refer (pprint-document)]))
88

@@ -19,10 +19,22 @@
1919
[:span sep "..."])]
2020
[:group open [:align ys ellipsis] close]))
2121

22-
(defrecord EdnPrinter [symbols print-meta print-length print-level]
22+
(defn- cached-override?
23+
[cache x]
24+
(let [clazz (type x)
25+
ret (get @cache clazz ::not-found)]
26+
(if (identical? ::not-found ret)
27+
(let [ret (satisfies? IOverride x)]
28+
(vswap! cache assoc clazz ret)
29+
ret)
30+
ret)))
31+
32+
(defrecord EdnPrinter [symbols print-meta print-length print-level cache]
2333

2434
fipp.visit/IVisitor
2535

36+
(visit-override? [_ x]
37+
(cached-override? cache x))
2638

2739
(visit-unknown [this x]
2840
(visit this (edn x)))
@@ -96,6 +108,7 @@
96108
([x] (pretty x {}))
97109
([x options]
98110
(let [defaults {:symbols {}
111+
:cache (volatile! {})
99112
:print-length *print-length*
100113
:print-level *print-level*
101114
:print-meta *print-meta*}

src/fipp/visit.cljc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
(ns fipp.visit
22
"Convert to and visit edn structures."
3-
(:require [fipp.util :as util]
4-
[fipp.ednize :refer [override?]]))
3+
(:require [fipp.util :as util]))
54

65
;;;TODO Stablize public interface
76

@@ -27,14 +26,16 @@
2726
(visit-var [this x])
2827
(visit-pattern [this x])
2928
(visit-record [this x])
29+
30+
(visit-override? [this x])
3031
)
3132

3233
(defn visit*
3334
"Visits objects, ignoring metadata."
3435
[visitor x]
3536
(cond
3637
(nil? x) (visit-nil visitor)
37-
(override? x) (visit-unknown visitor x)
38+
(visit-override? visitor x) (visit-unknown visitor x)
3839
(util/boolean? x) (visit-boolean visitor x)
3940
(string? x) (visit-string visitor x)
4041
(util/char? x) (visit-character visitor x)

0 commit comments

Comments
 (0)