          :board (delay (apply-conversions board moves))}
         ))
 
-    (group-by-in
+    (transduce
       (mapcat #(available-conversions-at board %))
-      [:winner :point]
-      (board/empty-cells board)))
-  )
+      (group-by-reducer [:winner :point])
+      (board/empty-cells board))
+    ))
 
-
-

      (conj moves (empty-cell-conversion (:winner move) (:point move)))
      )))


;; (require '[clojure.test.check.generators :as gen])
;; (def b (first (gen/sample (s/gen ::board/board) 1)))

(defn group-by-in
  "Group a collection of elements based on some keys to extract"
  [xf keys coll]
  (dissoc (transduce
            xf
            #(update-in %1 ((apply juxt keys) %2) conj %2)
            {}
            coll)
    nil))

(defn map-values
  "Apply a function to the values of a key-value collection"

    (board/update-cells board updates)))


(defn- apply-conversions
  [board moves]
  (if-let [move (first moves)]
    (reduce
