With lentes, two kinds of lenses can be created: two-way, writable lenses, and one-way, read-only lenses.
(def foobar (atom 5))
(def bar (l/focus-atom l/id foobar)) ;; has value 5
@foobar ; => 5
@bar ; => 5
(swap! foobar inc) ;; Both foobar and bar have value 6
(swap! bar inc) ;; Both have value 7
(satisfies? IAtom bar) ;; false, should be true
(satisfies? IWatchable bar) ;; true
(satisfies? IReset bar) ;; true
(satisfies? ISwap bar) ;; true
There is another problem related to the read-only lenses.
(def foobar (atom 5))
(def read-only (l/focus-atom (l/getter identity) foobar)) ; has value 5
(swap! inc foobar) ;; Both have value 6
(swap! inc read-only) ;; Fails as it should, it's a read-only lense
(satisfies? IAtom read-only) ;false, should be true
(satisfies? IWatchable read-only) ; true
(satisfies? IReset read-only) ; true, should be false?
(satisfies? ISwap read-only) ; true, should be false?