-
-
Save DarrenN/23c20551a01afc89cb80 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns user) | |
(def app | |
"Intenal Helper" | |
(fnil conj [])) | |
(defprotocol PathSeq | |
(path-seq* [form path] "Helper for path-seq")) | |
(extend-protocol PathSeq | |
java.util.List | |
(path-seq* | |
[form path] | |
(->> (map-indexed | |
(fn [idx item] | |
(path-seq* item (app path idx))) | |
form) | |
(mapcat identity))) | |
java.util.Map | |
(path-seq* | |
[form path] | |
(->> (map | |
(fn [[k v]] | |
(path-seq* v (app path k))) | |
form) | |
(mapcat identity))) | |
java.util.Set | |
(path-seq* | |
[form path] | |
(->> (map | |
(fn [v] | |
(path-seq* v (app path v))) | |
form) | |
(mapcat identity))) | |
java.lang.Object | |
(path-seq* [form path] [[form path]]) | |
nil | |
(path-seq* [_ path] [[nil path]])) | |
(defn path-seq | |
"Returns a sequence of paths into a form, and the elements found at | |
those paths. Each item in the sequence is a map with :path | |
and :form keys. Paths are built based on collection type: lists | |
by position, maps by key, and sets by value, e.g. | |
(path-seq [:a [:b :c] {:d :e} #{:f}]) | |
({:path [0], :form :a} | |
{:path [1 0], :form :b} | |
{:path [1 1], :form :c} | |
{:path [2 :d], :form :e} | |
{:path [3 :f], :form :f}) | |
" | |
[form] | |
(map | |
#(let [[form path] %] | |
{:path path :form form}) | |
(path-seq* form nil))) | |
(comment | |
(path-seq [:a [:b :c] {:d :e} #{:f}]) | |
;; finding nils hiding in data structures: | |
(->> (path-seq [:a [:b nil] {:d :e} #{:f}]) | |
(filter (comp nil? :form))) | |
;; finding a nil hiding in a Datomic transaction | |
(->> (path-seq {:db/id 100 | |
:friends [{:firstName "John"} | |
{:firstName nil}]}) | |
(filter (comp nil? :form))) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment