diff --git a/CHANGES.md b/CHANGES.md index 82f3802..f677b4d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ * Added `selected-any?` operation that returns true if any element is navigated to. * Huge performance improvements to `select`, `select-one`, `select-first`, and `select-one!` * Added META navigator (thanks @aengelberg) +* Bug fix: END, BEGINNING, FIRST, and LAST now work properly on nil ## 0.11.1 * More efficient inline caching for Clojure version, benchmarks show inline caching within 5% of manually precompiled code for all cases diff --git a/src/clj/com/rpl/specter/impl.cljx b/src/clj/com/rpl/specter/impl.cljx index e966bc3..56aa909 100644 --- a/src/clj/com/rpl/specter/impl.cljx +++ b/src/clj/com/rpl/specter/impl.cljx @@ -479,6 +479,12 @@ (prepend-all [structure elements])) (extend-protocol AddExtremes + nil + (append-all [_ elements] + elements) + (prepend-all [_ elements] + elements) + #+clj clojure.lang.PersistentVector #+cljs cljs.core/PersistentVector (append-all [structure elements] (reduce conj structure elements)) @@ -567,6 +573,9 @@ (extend-protocol FastEmpty + nil + (fast-empty? [_] true) + #+clj clojure.lang.IPersistentVector #+cljs cljs.core/PersistentVector (fast-empty? [v] (= 0 (vec-count v))) diff --git a/test/com/rpl/specter/core_test.cljx b/test/com/rpl/specter/core_test.cljx index 7df82a4..6493f6c 100644 --- a/test/com/rpl/specter/core_test.cljx +++ b/test/com/rpl/specter/core_test.cljx @@ -1191,3 +1191,8 @@ (first (select s/META (with-meta v meta-map))) (first (select s/META (setval s/META meta-map v)))))) + +(deftest beginning-end-on-nil + (is (= [2 3] (setval s/END [2 3] nil) (setval s/BEGINNING [2 3] nil))) + (is (nil? (setval s/FIRST :a nil))) + )