Skip to content

Commit

Permalink
Include skip cells when they're looked up via a skip label
Browse files Browse the repository at this point in the history
  • Loading branch information
prabhanshuguptagit committed Jun 24, 2024
1 parent 18c3444 commit f594fa1
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 29 deletions.
36 changes: 26 additions & 10 deletions src/bean/frames.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -157,15 +157,31 @@
(:skip-cells frame))))

(defn label-name->cells [sheet frame-name label-name & [dirn]]
;; Excludes skip labels
(->> (keys (:labels (get-frame sheet frame-name)))
(filter #(get-label sheet frame-name % dirn))
(filter #(when (= label-name
(:scalar (util/get-cell (:grid sheet) %)))
%))
(map #(label->cells sheet frame-name %))
(apply set/union)
(#(apply disj % (skipped-cells sheet frame-name)))))
(let [labels (->> (keys (:labels (get-frame sheet frame-name)))
(filter #(get-label sheet frame-name % dirn))
(filter #(when (= label-name
(:scalar (util/get-cell (:grid sheet) %)))
%)))
skip-label? #(get-in sheet [:frames frame-name :skip-cells %])
all-skipped-cells (skipped-cells sheet frame-name)
label-cells (->> labels
(map #(do [% (label->cells sheet frame-name %)]))
(into {}))
;; we keep track of the cells that were skipped at each step separately
;; so if a skip label is used at any step it can still access the skipped cells
;; in the function chain.
skips (->> label-cells
vals
(apply set/union)
(set/intersection all-skipped-cells))]
{:cells (->> label-cells
(map
(fn [[label cells]]
(if (skip-label? label)
cells
(set/difference cells skips))))
(apply set/union))
:skips skips}))

(defn mark-skipped [sheet frame-name addresses]
(update-in sheet [:frames frame-name :skip-cells] #(apply conj % (set addresses))))
Expand All @@ -186,7 +202,7 @@
(< updated-c (inc (second end)))
(>= updated-c (second start)))
frame-name)) (:frames sheet))]

(let [[end-r end-c] (:end (get-frame sheet at-end-of-frame))]
(resize-frame sheet at-end-of-frame {:end [(inc end-r) end-c]}))
sheet))
22 changes: 13 additions & 9 deletions src/bean/functions.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,16 @@
(reduce str "" arg))
args))

(defn- new-frame-result [sheet frame-result new-selection]
(defn- new-frame-result [sheet frame-result new-selection & [skips]]
(let [new-selection (set new-selection)]
{:matrix (util/map-on-matrix
#(if (get new-selection %)
(util/get-cell (:grid sheet) %)
{:scalar "" :representation ""})
(area/addresses->address-matrix new-selection))
:frame (merge frame-result
{:selection new-selection})}))
{:selection new-selection
:skips skips})}))

(defn bean-row [sheet args]
(let [frame-result (:frame (first args))
Expand Down Expand Up @@ -95,14 +96,17 @@
(let [frame-result (:frame (first args))
label (:scalar (second args))
existing-selection (:selection frame-result)
vget-cells (frames/label-name->cells
sheet
(:name frame-result) label dirn)
new-selection (set/intersection
vget-cells
existing-selection)]
get-cells (frames/label-name->cells
sheet
(:name frame-result) label dirn)
new-selection (set/union
(set/intersection (:cells get-cells) existing-selection)
(set/intersection (:skips frame-result) (:skips get-cells)))]
(if (frames/label? sheet (:name frame-result) label dirn)
(new-frame-result sheet frame-result new-selection)
(new-frame-result sheet frame-result new-selection
(set/union
(:skips frame-result)
(:skips get-cells)))
(errors/label-not-found
(:scalar (interpreter/eval-ast (second asts) sheet))))))

Expand Down
10 changes: 0 additions & 10 deletions test/bean/frames_test.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -87,16 +87,6 @@
(is (some? (get-in sheet [:frames frame-name :skip-cells [2 1]])))
(is (some? (get (frames/label->cells sheet frame-name [1 1]) [2 1]))))))

(deftest label-name->cells-test
(testing "Doesn't include skip cells from the result"
(let [frame-name "A frame"
sheet (as-> (new-sheet) sheet
(frames/make-frame sheet frame-name {:start [0 0] :end [2 2]})
(frames/add-label sheet frame-name [0 0] :top)
(grid/update-cell-content [0 0] sheet "A label")
(frames/mark-skipped sheet frame-name [[2 0]]))]
(is (= (frames/label-name->cells sheet frame-name "A label") #{[1 0]})))))

(deftest skipped-cells-test
(testing "Returns skipped cells and cells under a skip label"
(let [frame-name "A frame"
Expand Down

0 comments on commit f594fa1

Please sign in to comment.