    :looser :red,
    :taken [[8 5] [9 5]]}"
   [board [xi yi :as move] [dx dy]]
+  {:pre [(board? board)]}
   (loop [x (+ xi dx)
          y (+ yi dy)
          looser nil

(defn play-move
  "On player playing the move [x y] - update all the game state accordingly"
  [{:keys [player board] :as game} point]
  (if-let [moves (get-move-at game player point)]
    (->
      (reduce apply-move game moves)

(defn available-moves-xf
  "Transducer to get available moves on the map"
  [board]
  {:pre [(board? board)]}
  (comp
    (filter #(= (get-in board %) :empty))
    (mapcat #(available-moves-at board %))
