Skip to content

Commit 35b7507

Browse files
committed
Add IOverride cache
Closes #87
1 parent a4cb207 commit 35b7507

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

src/fipp/edn.cljc

Lines changed: 19 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,26 @@
1919
[:span sep "..."])]
2020
[:group open [:align ys ellipsis] close]))
2121

22-
(defrecord EdnPrinter [symbols print-meta print-length print-level]
22+
(defn- cache-satisfies
23+
([prot]
24+
(let [cache (volatile! {})]
25+
(fn [x]
26+
(cache-satisfies prot cache x))))
27+
([prot cache x]
28+
(let [clazz (type x)
29+
ret (get @cache clazz ::not-found)]
30+
(if (identical? ::not-found ret)
31+
(let [ret (satisfies? prot x)]
32+
(vswap! cache assoc clazz ret)
33+
ret)
34+
ret))))
35+
36+
(defrecord EdnPrinter [symbols print-meta print-length print-level cache]
2337

2438
fipp.visit/IVisitor
2539

40+
(visit-ovrride? [_ x]
41+
(cache-satisfies IOverride cache x))
2642

2743
(visit-unknown [this x]
2844
(visit this (edn x)))
@@ -96,6 +112,7 @@
96112
([x] (pretty x {}))
97113
([x options]
98114
(let [defaults {:symbols {}
115+
:cache (volatile! {})
99116
:print-length *print-length*
100117
:print-level *print-level*
101118
:print-meta *print-meta*}

src/fipp/visit.cljc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@
2727
(visit-var [this x])
2828
(visit-pattern [this x])
2929
(visit-record [this x])
30+
31+
(visit-ovrride? [this x])
3032
)
3133

3234
(defn visit*
3335
"Visits objects, ignoring metadata."
3436
[visitor x]
3537
(cond
3638
(nil? x) (visit-nil visitor)
37-
(override? x) (visit-unknown visitor x)
39+
(visit-ovrride? visitor x) (visit-unknown visitor x)
3840
(util/boolean? x) (visit-boolean visitor x)
3941
(string? x) (visit-string visitor x)
4042
(util/char? x) (visit-character visitor x)

0 commit comments

Comments
 (0)