-
Notifications
You must be signed in to change notification settings - Fork 43
/
visit.cljc
61 lines (53 loc) · 1.57 KB
/
visit.cljc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(ns fipp.visit
"Convert to and visit edn structures."
(:require [fipp.util :as util]
[fipp.ednize :refer [override?]]))
;;;TODO Stablize public interface
(defprotocol IVisitor
(visit-unknown [this x])
(visit-nil [this])
(visit-boolean [this x])
(visit-string [this x])
(visit-character [this x])
(visit-symbol [this x])
(visit-keyword [this x])
(visit-number [this x])
(visit-seq [this x])
(visit-vector [this x])
(visit-map [this x])
(visit-set [this x])
(visit-tagged [this x])
;; Not strictly Edn...
(visit-meta [this meta x])
(visit-var [this x])
(visit-pattern [this x])
(visit-record [this x])
)
(defn visit*
"Visits objects, ignoring metadata."
[visitor x]
(cond
(nil? x) (visit-nil visitor)
(override? x) (visit-unknown visitor x)
(util/boolean? x) (visit-boolean visitor x)
(string? x) (visit-string visitor x)
(util/char? x) (visit-character visitor x)
(symbol? x) (visit-symbol visitor x)
(keyword? x) (visit-keyword visitor x)
(number? x) (visit-number visitor x)
(seq? x) (visit-seq visitor x)
(vector? x) (visit-vector visitor x)
(record? x) (visit-record visitor x)
(map? x) (visit-map visitor x)
(set? x) (visit-set visitor x)
(tagged-literal? x) (visit-tagged visitor x)
(var? x) (visit-var visitor x)
(util/regexp? x) (visit-pattern visitor x)
:else (visit-unknown visitor x)))
(defn value-meta [x]
(when (util/value-obj? x)
(meta x)))
(defn visit [visitor x]
(if-let [m (value-meta x)]
(visit-meta visitor m x)
(visit* visitor x)))