Skip to content

Commit ceac622

Browse files
authored
Merge pull request #17 from active-group/accessors-as-lenses
Remove explicit lens definition in favor of regular accessors being lenses
2 parents 0bfb38b + a66b97b commit ceac622

File tree

2 files changed

+41
-33
lines changed

2 files changed

+41
-33
lines changed

src/active/clojure/record.cljc

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@
1515
[msg]
1616
(c/assertion-violation `throw-illegal-argument-exception "Illegal argument" msg))
1717

18+
19+
(defn report-lens-deprecation [type]
20+
(println (str "active.clojure.record WARNING for record-type `" type
21+
"`: the explicit definition of lenses is deprecated in favor of regular "
22+
"accessors already being lenses")))
23+
24+
1825
;; Only needed in ClojureScript, does nothing in Clojure
1926
(defn check-type
2027
[type rec]
@@ -158,28 +165,29 @@
158165
?field-triples))))
159166
(declare ~@(map (fn [[?field ?accessor ?lens]] ?accessor) ?field-triples))
160167
~@(mapcat (fn [[?field ?accessor ?lens]]
161-
(let [?rec (with-meta `rec# {:tag ?type})]
162-
`((def ~(document-with-arglist ?accessor (vector ?type) (str "Access `" ?field "` field"
163-
(name-doc ?field)
164-
" from a [[" ?type "]] record. " ?docref))
165-
(fn [~?rec]
166-
(check-type ~?type ~?rec)
167-
(. ~?rec ~(symbol (str "-" ?field)))))
168-
~@(if ?lens
169-
(let [?data `data#
170-
?v `v#]
171-
`((def ~(document ?lens (str "Lens for the `" ?field "` field"
172-
(name-doc ?field)
173-
" from a [[" ?type "]] record." ?docref))
174-
(lens/lens ~?accessor
175-
(fn [~?data ~?v]
176-
(~?constructor ~@(map
177-
(fn [[?shove-field ?shove-accessor]]
178-
(if (= ?field ?shove-field)
179-
?v
180-
`(~?shove-accessor ~?data)))
181-
?field-triples)))))))
182-
'()))))
168+
(let [?rec (with-meta `rec# {:tag ?type})
169+
?data `data#
170+
?v `v#]
171+
`((def ~(document-with-arglist
172+
?accessor
173+
(vector ?type)
174+
(str "Lens for the `" ?field "` field"
175+
(name-doc ?field)
176+
" from a [[" ?type "]] record. " ?docref))
177+
(lens/lens (fn [~?rec]
178+
(check-type ~?type ~?rec)
179+
(. ~?rec ~(symbol (str "-" ?field))))
180+
(fn [~?data ~?v]
181+
(~?constructor ~@(map
182+
(fn [[?shove-field ?shove-accessor]]
183+
(if (= ?field ?shove-field)
184+
?v
185+
`(~?shove-accessor ~?data)))
186+
?field-triples)))))
187+
~(when ?lens
188+
(report-lens-deprecation ?type)
189+
`(def ~?lens ~?accessor))
190+
)))
183191
?field-triples)))))
184192

185193

test/active/clojure/record_test.cljc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,27 +72,27 @@
7272
(define-record-type ^{:doc "Lens example"} LensPare
7373
(lens-kons a b)
7474
lens-pare?
75-
[(^{:doc "a field"} a lens-kar lens-kar-lens)
76-
(^{:doc "b field"} b lens-kdr lens-kdr-lens)])
75+
[^{:doc "a field"} a lens-kar
76+
^{:doc "b field"} b lens-kdr])
7777

7878
(deftest pare-lens
79-
(lens-laws-hold lens-kar-lens (lens-kons 1 2) 23 42)
80-
(lens-laws-hold lens-kdr-lens (lens-kons 1 2) 23 42)
79+
(lens-laws-hold lens-kar (lens-kons 1 2) 23 42)
80+
(lens-laws-hold lens-kdr (lens-kons 1 2) 23 42)
8181
(is (= (lens-kons "a" 42)
82-
(lens/shove (lens-kons 23 42) lens-kar-lens "a")))
82+
(lens/shove (lens-kons 23 42) lens-kar "a")))
8383
(is (= (lens-kons 23 "b")
84-
(lens/shove (lens-kons 23 42) lens-kdr-lens "b"))))
84+
(lens/shove (lens-kons 23 42) lens-kdr "b"))))
8585

8686
(define-record-type Quadruple
8787
(quadruple a b c d)
8888
quadruple?
89-
[(a quadruple-one quadruple-one-lens)
89+
[a quadruple-one
9090
b quadruple-two
91-
(c quadruple-three quadruple-three-lens)
91+
c quadruple-three
9292
d quadruple-four])
9393

9494
(deftest quadruple-lens
95-
(lens-laws-hold quadruple-one-lens (quadruple 'a 'b 'c 'd) 12 78)
96-
(lens-laws-hold quadruple-three-lens (quadruple 'a 'b 'c 'd) 12 78)
95+
(lens-laws-hold quadruple-one (quadruple 'a 'b 'c 'd) 12 78)
96+
(lens-laws-hold quadruple-three (quadruple 'a 'b 'c 'd) 12 78)
9797
(is (= (quadruple 4 8 15 16)
98-
(lens/shove (quadruple 108 8 15 16) quadruple-one-lens 4))))
98+
(lens/shove (quadruple 108 8 15 16) quadruple-one 4))))

0 commit comments

Comments
 (0)