|  | @@ -128,8 +128,6 @@
 | 
	
		
			
				|  |  |      {}
 | 
	
		
			
				|  |  |      data))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -;(create-all-back-references (create-all-references {"A" {1 {:value "=B2"}} "B" {2 {:value "=B3"} 3 {:value "=A1"}}}))
 | 
	
		
			
				|  |  | -;(= (walk-modify-data (:alt-table-data microtables-frontend.db/default-db) #(-> %3 (dissoc :refs) (dissoc :inbound) (add-references))) (walk-modify-data (:alt-table-data microtables-frontend.db/default-db) #(add-references (dissoc (dissoc %3 :refs) :inbound))) (create-all-references (:alt-table-data microtables-frontend.db/default-db)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defn walk-get-refs
 | 
	
		
			
				|  |  |    "Walks through the data map and returns a list of :col/:row maps for each cell which satisfies the predicate (a function accepting col, row, datum)."
 | 
	
	
		
			
				|  | @@ -166,7 +164,6 @@
 | 
	
		
			
				|  |  |                 new-queue (concat (rest queue) (:inbound datum))]
 | 
	
		
			
				|  |  |             (recur new-data new-queue)))))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -;(walk-get-refs (set-dirty-flags (create-all-back-references (create-all-references (:alt-table-data microtables-frontend.db/default-db))) "C" 5) #(true? (:dirty %3)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defn change-datum-value
 | 
	
		
			
				|  |  |    "Modify the value of a datum in the table, and update all applicable references"
 | 
	
	
		
			
				|  | @@ -269,11 +266,6 @@
 | 
	
		
			
				|  |  |                    new-datum (assoc datum :display evaluated-value)]
 | 
	
		
			
				|  |  |                (assoc-in data [c r] new-datum)))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -;(time (gather-variables-and-evaluate-cell {"A" {1 {:value "=A2 + 4" :refs '({:col "A" :row 2})} 2 {:value "2"}}} "A" 1))
 | 
	
		
			
				|  |  | -;(time (gather-variables-and-evaluate-cell (create-all-back-references (create-all-references (:alt-table-data microtables-frontend.db/default-db))) "B" 7))
 | 
	
		
			
				|  |  | -;(time (set-dirty-flags (create-all-back-references (create-all-references (:alt-table-data microtables-frontend.db/default-db))) "B" 7))
 | 
	
		
			
				|  |  | -;(zipmap (map #(str (:col %) (:row %)) (list {:col "A" :row 1} {:col "A" :row 2} {:col "A" :row 3} {:col "A" :row 4})) (list 1 3 5 7))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ; THE NEW EVALUATE FUNCTION
 | 
	
		
			
				|  |  |  ; - check for cycles in the back references, starting from the target cell (if any, use another function to mark it and its back references with :cycle-error and remove :dirty)
 | 
	
	
		
			
				|  | @@ -311,15 +303,36 @@
 | 
	
		
			
				|  |  |                            (rest queue))]                                                        ; if the current cell is not marked as dirty, then it has already been processed
 | 
	
		
			
				|  |  |            (recur re-evaluated-data new-queue))))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -(defn alt-re-evaluate
 | 
	
		
			
				|  |  | -  "Evaluate the values of cells that contain formulae, following reference chains if applicable."
 | 
	
		
			
				|  |  | -  [data]
 | 
	
		
			
				|  |  | -  (let [non-empty-cells (flatten (map (fn [[c v]] (map (fn [[r _]] {:col c :row r}) v)) data))
 | 
	
		
			
				|  |  | -        {has-formula true original-values false} (group-by #(= (first (get-in data [(:col %) (:row %) :value])) "=") non-empty-cells)
 | 
	
		
			
				|  |  | -        found-cycles (map #(let [found (alt-find-cycle data (:col %) (:row %))]
 | 
	
		
			
				|  |  | -                             (if found (assoc % :error found) %)) has-formula)]
 | 
	
		
			
				|  |  | -    non-empty-cells))
 | 
	
		
			
				|  |  | +;TODO: does this need a cycle check?
 | 
	
		
			
				|  |  | +(defn evaluate-all
 | 
	
		
			
				|  |  | +  "Evaluates all cells marked as \"dirty\". Generally reserved for the initialization."
 | 
	
		
			
				|  |  | +  ([data]
 | 
	
		
			
				|  |  | +   (evaluate-all data (walk-get-refs data #(:dirty %3))))
 | 
	
		
			
				|  |  | +  ([data queue]
 | 
	
		
			
				|  |  | +   (if (empty? queue)
 | 
	
		
			
				|  |  | +     data
 | 
	
		
			
				|  |  | +     (let [cur (first queue)
 | 
	
		
			
				|  |  | +           cc (:col cur)
 | 
	
		
			
				|  |  | +           cr (:row cur)
 | 
	
		
			
				|  |  | +           dirty? (get-in data [cc cr :dirty])]
 | 
	
		
			
				|  |  | +       (if dirty?
 | 
	
		
			
				|  |  | +         (let [evaluated (evaluate-from-cell data (:col cur) (:row cur))
 | 
	
		
			
				|  |  | +               result (get-in evaluated [cc cr :display])]
 | 
	
		
			
				|  |  | +           (if (= result :insufficient-data)
 | 
	
		
			
				|  |  | +             (recur data (concat (rest queue) (list cur)))
 | 
	
		
			
				|  |  | +             (recur evaluated (rest queue))))
 | 
	
		
			
				|  |  | +         (recur data (rest queue)))))))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(evaluate-all (walk-modify-data (:alt-table-data microtables-frontend.db/default-db) (fn [c r datum] (if (= (first (:value datum)) "=") (assoc datum :dirty true) datum))))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#_(defn alt-re-evaluate
 | 
	
		
			
				|  |  | +    "Evaluate the values of cells that contain formulae, following reference chains if applicable."
 | 
	
		
			
				|  |  | +    [data]
 | 
	
		
			
				|  |  | +    (let [non-empty-cells (flatten (map (fn [[c v]] (map (fn [[r _]] {:col c :row r}) v)) data))
 | 
	
		
			
				|  |  | +          {has-formula true original-values false} (group-by #(= (first (get-in data [(:col %) (:row %) :value])) "=") non-empty-cells)
 | 
	
		
			
				|  |  | +          found-cycles (map #(let [found (alt-find-cycle data (:col %) (:row %))]
 | 
	
		
			
				|  |  | +                               (if found (assoc % :error found) %)) has-formula)]
 | 
	
		
			
				|  |  | +      non-empty-cells))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defn find-val [data c r]
 | 
	
	
		
			
				|  | @@ -332,8 +345,6 @@
 | 
	
		
			
				|  |  |        formula? :not-yet
 | 
	
		
			
				|  |  |        :else v)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -;TODO: ADD DOCSTRINGS TO ALL CONNECTED FUNCTIONS AND RENAME VARIABLES WHERE NEEDED
 | 
	
		
			
				|  |  | -;TODO: figure out how to re-evaluate only when the cell modified affects other cells
 | 
	
		
			
				|  |  |  (defn re-evaluate [data]
 | 
	
		
			
				|  |  |    (println "re-evaluating" data)
 | 
	
		
			
				|  |  |    (let [{has-formula true original-values false} (group-by #(= (first (:value %)) "=") data)
 |