|
1498 | 1498 | (merge x (hoist-nested-wrapped-value (get-safe x :nextjournal/value))) |
1499 | 1499 | x)) |
1500 | 1500 |
|
1501 | | -(defn apply-viewers* [wrapped-value] |
1502 | | - (let [hoisted-wrapped-value (hoist-nested-wrapped-value wrapped-value) |
1503 | | - viewers (->viewers hoisted-wrapped-value) |
1504 | | - _ (when (empty? viewers) |
1505 | | - (throw (ex-info "cannot apply empty viewers" {:wrapped-value wrapped-value}))) |
1506 | | - {:as viewer viewers-to-add :add-viewers :keys [render-fn transform-fn]} |
1507 | | - (viewer-for viewers hoisted-wrapped-value) |
1508 | | - transformed-value (cond-> (ensure-wrapped-with-viewers viewers |
1509 | | - (cond-> (-> hoisted-wrapped-value |
1510 | | - (dissoc :nextjournal/viewer) |
1511 | | - (assoc :nextjournal/applied-viewer viewer)) |
1512 | | - transform-fn transform-fn)) |
1513 | | - viewers-to-add (update :nextjournal/viewers add-viewers viewers-to-add)) |
1514 | | - wrapped-value' (cond-> transformed-value |
1515 | | - (-> transformed-value ->value wrapped-value?) |
1516 | | - (merge (->value transformed-value)))] |
1517 | | - (if (and transform-fn (not render-fn)) |
1518 | | - (recur wrapped-value') |
1519 | | - (-> wrapped-value' |
1520 | | - (assoc :nextjournal/viewer viewer) |
1521 | | - (merge (->opts wrapped-value)))))) |
| 1501 | +(defn apply-viewers* |
| 1502 | + [wrapped-value] |
| 1503 | + (loop [recursion-counter 0 |
| 1504 | + wrapped-value wrapped-value] |
| 1505 | + (let [hoisted-wrapped-value (hoist-nested-wrapped-value wrapped-value) |
| 1506 | + viewers (->viewers hoisted-wrapped-value) |
| 1507 | + _ (when (empty? viewers) |
| 1508 | + (throw (ex-info "cannot apply empty viewers" {:wrapped-value wrapped-value}))) |
| 1509 | + {:as viewer viewers-to-add :add-viewers :keys [render-fn transform-fn]} |
| 1510 | + (viewer-for viewers hoisted-wrapped-value) |
| 1511 | + transformed-value (cond-> (ensure-wrapped-with-viewers viewers |
| 1512 | + (cond-> (-> hoisted-wrapped-value |
| 1513 | + (dissoc :nextjournal/viewer) |
| 1514 | + (assoc :nextjournal/applied-viewer viewer)) |
| 1515 | + transform-fn transform-fn)) |
| 1516 | + viewers-to-add (update :nextjournal/viewers add-viewers viewers-to-add)) |
| 1517 | + wrapped-value' (cond-> transformed-value |
| 1518 | + (-> transformed-value ->value wrapped-value?) |
| 1519 | + (merge (->value transformed-value)))] |
| 1520 | + (if (and transform-fn (not render-fn)) |
| 1521 | + (if (<= 10 recursion-counter) |
| 1522 | + (throw (ex-info "infinity" wrapped-value')) |
| 1523 | + (recur (inc recursion-counter) wrapped-value')) |
| 1524 | + (-> wrapped-value' |
| 1525 | + (assoc :nextjournal/viewer viewer) |
| 1526 | + (merge (->opts wrapped-value))))))) |
1522 | 1527 |
|
1523 | 1528 | (defn apply-viewers [x] |
1524 | 1529 | (apply-viewers* (ensure-wrapped-with-viewers x))) |
|
0 commit comments