add comments about what can be parameterized
This commit is contained in:
parent
2a30a6aba5
commit
224369f4eb
1 changed files with 69 additions and 12 deletions
|
|
@ -106,15 +106,29 @@
|
||||||
|
|
||||||
;; Helpers for defining selectors and collectors with late-bound params
|
;; Helpers for defining selectors and collectors with late-bound params
|
||||||
|
|
||||||
(def bind-params* i/bind-params*)
|
(def ^{:doc "Takes a compiled selector that needs late-bound params and supplies it with
|
||||||
|
an array of params and a position in the array from which to begin reading
|
||||||
|
params. The return value is an executable selector."}
|
||||||
|
bind-params* i/bind-params*)
|
||||||
|
|
||||||
(defmacro paramspath [params & impls]
|
(defmacro paramspath
|
||||||
|
"Defines a StructurePath with late bound parameters. This path can be precompiled
|
||||||
|
with other selectors without knowing the parameters. When precompiled with other
|
||||||
|
selectors, the resulting selector takes in parameters for all selectors in the path
|
||||||
|
that needed parameters (in the order in which they were declared)."
|
||||||
|
[params & impls]
|
||||||
(let [num-params (count params)
|
(let [num-params (count params)
|
||||||
retrieve-params (i/make-param-retrievers params)]
|
retrieve-params (i/make-param-retrievers params)]
|
||||||
(i/paramspath* retrieve-params num-params impls)
|
(i/paramspath* retrieve-params num-params impls)
|
||||||
))
|
))
|
||||||
|
|
||||||
(defmacro paramscollector [params impl]
|
(defmacro paramscollector
|
||||||
|
"Defines a Collector with late bound parameters. This collector can be precompiled
|
||||||
|
with other selectors without knowing the parameters. When precompiled with other
|
||||||
|
selectors, the resulting selector takes in parameters for all selectors in the path
|
||||||
|
that needed parameters (in the order in which they were declared).
|
||||||
|
"
|
||||||
|
[params impl]
|
||||||
(let [num-params (count params)
|
(let [num-params (count params)
|
||||||
retrieve-params (i/make-param-retrievers params)]
|
retrieve-params (i/make-param-retrievers params)]
|
||||||
(i/paramscollector* retrieve-params num-params impl)
|
(i/paramscollector* retrieve-params num-params impl)
|
||||||
|
|
@ -126,7 +140,12 @@
|
||||||
(defmacro defparamscollector [name & body]
|
(defmacro defparamscollector [name & body]
|
||||||
`(def ~name (paramscollector ~@body)))
|
`(def ~name (paramscollector ~@body)))
|
||||||
|
|
||||||
(defmacro fixed-pathed-path [bindings & impls]
|
(defmacro fixed-pathed-path
|
||||||
|
"This helper is used to define selectors that take in a fixed number of other selector
|
||||||
|
paths as input. Those selector paths may require late-bound params, so this helper
|
||||||
|
will create a parameterized selector if that is the case. If no late-bound params
|
||||||
|
are required, then the result is executable."
|
||||||
|
[bindings & impls]
|
||||||
(let [bindings (partition 2 bindings)
|
(let [bindings (partition 2 bindings)
|
||||||
paths (mapv second bindings)
|
paths (mapv second bindings)
|
||||||
names (mapv first bindings)
|
names (mapv first bindings)
|
||||||
|
|
@ -140,7 +159,12 @@
|
||||||
(mapcat (fn [n l] [n `(~l ~i/PARAMS-SYM ~i/PARAMS-IDX-SYM)]) names latefn-syms)
|
(mapcat (fn [n l] [n `(~l ~i/PARAMS-SYM ~i/PARAMS-IDX-SYM)]) names latefn-syms)
|
||||||
impls)))
|
impls)))
|
||||||
|
|
||||||
(defmacro variable-pathed-path [[latepaths-seq-sym paths-seq] & impls]
|
(defmacro variable-pathed-path
|
||||||
|
"This helper is used to define selectors that take in a variable number of other selector
|
||||||
|
paths as input. Those selector paths may require late-bound params, so this helper
|
||||||
|
will create a parameterized selector if that is the case. If no late-bound params
|
||||||
|
are required, then the result is executable."
|
||||||
|
[[latepaths-seq-sym paths-seq] & impls]
|
||||||
(let [latefns-sym (gensym "latefns")]
|
(let [latefns-sym (gensym "latefns")]
|
||||||
(i/pathed-path*
|
(i/pathed-path*
|
||||||
i/paramspath*
|
i/paramspath*
|
||||||
|
|
@ -152,7 +176,12 @@
|
||||||
impls
|
impls
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(defmacro pathed-collector [[name path] impl]
|
(defmacro pathed-collector
|
||||||
|
"This helper is used to define collectors that take in a single selector
|
||||||
|
paths as input. That path may require late-bound params, so this helper
|
||||||
|
will create a parameterized selector if that is the case. If no late-bound params
|
||||||
|
are required, then the result is executable."
|
||||||
|
[[name path] impl]
|
||||||
(let [latefns-sym (gensym "latefns")
|
(let [latefns-sym (gensym "latefns")
|
||||||
latefn (gensym "latefn")]
|
latefn (gensym "latefn")]
|
||||||
(i/pathed-path*
|
(i/pathed-path*
|
||||||
|
|
@ -175,14 +204,22 @@
|
||||||
|
|
||||||
(def FIRST (i/->PosStructurePath first i/set-first))
|
(def FIRST (i/->PosStructurePath first i/set-first))
|
||||||
|
|
||||||
(defparamspath srange-dynamic [start-fn end-fn]
|
(defparamspath
|
||||||
|
^{:doc "Uses start-fn and end-fn to determine the bounds of the subsequence
|
||||||
|
to select when navigating. Each function takes in the structure as input."}
|
||||||
|
srange-dynamic
|
||||||
|
[start-fn end-fn]
|
||||||
(select* [this structure next-fn]
|
(select* [this structure next-fn]
|
||||||
(i/srange-select structure (start-fn structure) (end-fn structure) next-fn))
|
(i/srange-select structure (start-fn structure) (end-fn structure) next-fn))
|
||||||
(transform* [this structure next-fn]
|
(transform* [this structure next-fn]
|
||||||
(i/srange-transform structure (start-fn structure) (end-fn structure) next-fn)
|
(i/srange-transform structure (start-fn structure) (end-fn structure) next-fn)
|
||||||
))
|
))
|
||||||
|
|
||||||
(defparamspath srange [start end]
|
(defparamspath
|
||||||
|
^{:doc "Navigates to the subsequence bound by the indexes start (inclusive)
|
||||||
|
and end (exclusive)"}
|
||||||
|
srange
|
||||||
|
[start end]
|
||||||
(select* [this structure next-fn]
|
(select* [this structure next-fn]
|
||||||
(i/srange-select structure start end next-fn))
|
(i/srange-select structure start end next-fn))
|
||||||
(transform* [this structure next-fn]
|
(transform* [this structure next-fn]
|
||||||
|
|
@ -197,7 +234,15 @@
|
||||||
|
|
||||||
(defn codewalker [afn] (i/->CodeWalkerStructurePath afn))
|
(defn codewalker [afn] (i/->CodeWalkerStructurePath afn))
|
||||||
|
|
||||||
(defn filterer [& path]
|
(defn filterer
|
||||||
|
"Navigates to a view of the current sequence that only contains elements that
|
||||||
|
match the given selector path. An element matches the selector path if calling select
|
||||||
|
on that element with the selector path yields anything other than an empty sequence.
|
||||||
|
|
||||||
|
The input path may be parameterized, in which case the result of filterer
|
||||||
|
will be parameterized in the order of which the parameterized selectors
|
||||||
|
were declared."
|
||||||
|
[& path]
|
||||||
(fixed-pathed-path [late path]
|
(fixed-pathed-path [late path]
|
||||||
(select* [this structure next-fn]
|
(select* [this structure next-fn]
|
||||||
(->> structure (filter #(i/selected?* late %)) doall next-fn))
|
(->> structure (filter #(i/selected?* late %)) doall next-fn))
|
||||||
|
|
@ -225,7 +270,11 @@
|
||||||
(defn selected?
|
(defn selected?
|
||||||
"Filters the current value based on whether a selector finds anything.
|
"Filters the current value based on whether a selector finds anything.
|
||||||
e.g. (selected? :vals ALL even?) keeps the current element only if an
|
e.g. (selected? :vals ALL even?) keeps the current element only if an
|
||||||
even number exists for the :vals key"
|
even number exists for the :vals key.
|
||||||
|
|
||||||
|
The input path may be parameterized, in which case the result of selected?
|
||||||
|
will be parameterized in the order of which the parameterized selectors
|
||||||
|
were declared."
|
||||||
[& path]
|
[& path]
|
||||||
(fixed-pathed-path [late path]
|
(fixed-pathed-path [late path]
|
||||||
(select* [this structure next-fn]
|
(select* [this structure next-fn]
|
||||||
|
|
@ -254,7 +303,11 @@
|
||||||
|
|
||||||
(defn transformed
|
(defn transformed
|
||||||
"Navigates to a view of the current value by transforming it with the
|
"Navigates to a view of the current value by transforming it with the
|
||||||
specified selector and update-fn."
|
specified selector and update-fn.
|
||||||
|
|
||||||
|
The input path may be parameterized, in which case the result of transformed
|
||||||
|
will be parameterized in the order of which the parameterized selectors
|
||||||
|
were declared."
|
||||||
[path update-fn]
|
[path update-fn]
|
||||||
(fixed-pathed-path [late path]
|
(fixed-pathed-path [late path]
|
||||||
(select* [this structure next-fn]
|
(select* [this structure next-fn]
|
||||||
|
|
@ -314,7 +367,11 @@
|
||||||
Tests the structure if selecting with cond-path returns anything.
|
Tests the structure if selecting with cond-path returns anything.
|
||||||
If so, it uses the following selector for this portion of the navigation.
|
If so, it uses the following selector for this portion of the navigation.
|
||||||
Otherwise, it tries the next cond-path. If nothing matches, then the structure
|
Otherwise, it tries the next cond-path. If nothing matches, then the structure
|
||||||
is not selected."
|
is not selected.
|
||||||
|
|
||||||
|
The input paths may be parameterized, in which case the result of cond-path
|
||||||
|
will be parameterized in the order of which the parameterized selectors
|
||||||
|
were declared."
|
||||||
[& conds]
|
[& conds]
|
||||||
(variable-pathed-path [compiled-paths conds]
|
(variable-pathed-path [compiled-paths conds]
|
||||||
(select* [this structure next-fn]
|
(select* [this structure next-fn]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue