Skip to content

Commit cdf2938

Browse files
committed
Working example of by-map-key viewer selection
1 parent 294f494 commit cdf2938

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

notebooks/viewers/by_map_key.clj

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
;; # 🔪 By Map Key
2+
^{:nextjournal.clerk/visibility {:code :hide}}
3+
(ns notebooks.viewers.by-map-key
4+
(:require [nextjournal.clerk :as clerk]
5+
[nextjournal.clerk.viewer :as viewer]))
6+
7+
8+
;; When modeling a domain with namespaced keys in Clojure, it would
9+
;; often be nice to select a given viewer for a value in the map,
10+
;; based on the key.
11+
12+
;; Let's start with an example: `vin-viewer` is a viewer for a [Vehicle identification number](https://en.wikipedia.org/wiki/Vehicle_identification_number).
13+
(def vin-viewer
14+
{:pred string?
15+
:transform-fn (clerk/update-val (fn [vin] (clerk/html (let [[head rest] (split-at 10 vin)]
16+
[:span.font-mono.text-xs
17+
head
18+
[:b rest]]))))})
19+
20+
;; We can manually select it using `clerk/with-viewer`.
21+
22+
(clerk/with-viewer vin-viewer
23+
"WBAJD51080BL18969")
24+
25+
(def key->viewer
26+
{:vehicle/vin vin-viewer})
27+
28+
29+
;; Or create a viewer to select it automatically for values associated with the `:vehicle/vin` key.
30+
31+
(clerk/with-viewers (clerk/add-viewers [{:pred {:wrapped (fn [{:as wrapped-value :keys [path]}]
32+
(and (map-entry? (clerk/->value wrapped-value))
33+
(contains? key->viewer (key (clerk/->value wrapped-value)))
34+
;; make sure we only add it once
35+
;; TOOD: use better check
36+
(not (some (comp `#{key->viewer} :name) (:nextjournal/viewers wrapped-value)))))}
37+
:transform-fn (fn [{:as wrapped-value :keys [path]}]
38+
(let [val-viewer (get key->viewer (key (clerk/->value wrapped-value)))]
39+
(update wrapped-value
40+
:nextjournal/viewers
41+
clerk/add-viewers
42+
[{:name `key->viewer
43+
:pred {:wrapped (fn [wrapped-value']
44+
(= (:path wrapped-value')
45+
(conj path 1)))}
46+
:transform-fn (partial clerk/with-viewer val-viewer)}])))}])
47+
{:vehicle/vin "WBAJD51080BL18969"})
48+
49+
50+
51+

0 commit comments

Comments
 (0)