|
118 | 118 |
|
119 | 119 | (defmacro two-field-entity [tp doc & {:keys [major-field-types major-field-ctor |
120 | 120 | minor-field-ctor minor-field-default]}] |
121 | | - (let [fname (with-meta (symbol (jt.u/dashize (str tp))) {:tag tp}) |
122 | | - arg (gensym)] |
| 121 | + (let [[major-field-ctor major-field-type] major-field-ctor |
| 122 | + [minor-field-ctor minor-field-type] minor-field-ctor |
| 123 | + fname (with-meta (symbol (jt.u/dashize (str tp))) {:tag tp}) |
| 124 | + arg (gensym) |
| 125 | + tmp-major (with-meta (gensym) {:tag major-field-type}) |
| 126 | + tmp-minor (with-meta (gensym) {:tag minor-field-type})] |
123 | 127 | `(do |
124 | 128 | (defn ^{:doc ~(str "True if `" tp "`.") } ~(symbol (str fname "?")) |
125 | 129 | [o#] |
|
128 | 132 | (defn ~fname ~doc |
129 | 133 | ([] (. ~tp from (jt.z/zoned-date-time))) |
130 | 134 | ([~arg] (cond (some (fn [x#] (instance? x# ~arg)) ~major-field-types) |
131 | | - (. ~tp of (~major-field-ctor ~arg) ~minor-field-default) |
| 135 | + (let [~tmp-major (~major-field-ctor ~arg)] |
| 136 | + (. ~tp of ~tmp-major ~minor-field-default)) |
132 | 137 |
|
133 | 138 | (instance? TemporalAccessor ~arg) |
134 | 139 | (. ~tp from ~arg) |
|
144 | 149 | (catch java.time.format.DateTimeParseException _# |
145 | 150 | (. ~tp now (jt.z/zone-id ~arg)))) |
146 | 151 |
|
147 | | - :else (. ~tp of (~major-field-ctor ~arg) ~minor-field-default))) |
| 152 | + :else (let [~tmp-major (~major-field-ctor ~arg)] |
| 153 | + (. ~tp of ~tmp-major ~minor-field-default)))) |
148 | 154 | ([a# b#] |
149 | 155 | (if (and (or (instance? DateTimeFormatter a#) (string? a#)) (string? b#)) |
150 | 156 | (~fname (jt.f/parse a# b#)) |
151 | | - (. ~tp of (~major-field-ctor a#) (~minor-field-ctor b#))))) |
| 157 | + (let [~tmp-major (~major-field-ctor a#) |
| 158 | + ~tmp-minor (~minor-field-ctor b#)] |
| 159 | + (. ~tp of ~tmp-major ~tmp-minor))))) |
152 | 160 |
|
153 | 161 | (extend-type ~tp |
154 | 162 | jt.c/Ordered |
|
175 | 183 | (two-field-entity MonthDay |
176 | 184 | "Returns the `MonthDay` for the given entity, string, clock, zone or |
177 | 185 | month/day combination. Current month-day if no arguments given." |
178 | | - :major-field-ctor month |
| 186 | + :major-field-ctor [month Month] |
179 | 187 | :major-field-types [Month Number] |
180 | | - :minor-field-ctor (comp int jt.c/value) |
| 188 | + :minor-field-ctor [(comp int jt.c/value) int] |
181 | 189 | :minor-field-default 1) |
182 | 190 |
|
183 | 191 | (two-field-entity YearMonth |
184 | 192 | "Returns the `YearMonth` for the given entity, string, clock, zone or |
185 | 193 | month/day combination. Current year-month if no arguments given." |
186 | | - :major-field-ctor (comp int jt.c/value) |
| 194 | + :major-field-ctor [(comp int jt.c/value) int] |
187 | 195 | :major-field-types [Year Number] |
188 | | - :minor-field-ctor month |
| 196 | + :minor-field-ctor [month Month] |
189 | 197 | :minor-field-default 1) |
190 | 198 |
|
191 | 199 | ;;;;;;;;;; Threeten Extra |
|
218 | 226 | (two-field-entity YearQuarter |
219 | 227 | "Returns the `YearQuarter` for the given entity, clock, zone or year with quarter. |
220 | 228 | Current year quarter if no arguments given." |
221 | | - :major-field-ctor year-to-int |
| 229 | + :major-field-ctor [year-to-int int] |
222 | 230 | :major-field-types [Year Number] |
223 | | - :minor-field-ctor quarter |
| 231 | + :minor-field-ctor [quarter Quarter] |
224 | 232 | :minor-field-default 1)) |
0 commit comments