(ns bst-properties-based-testing.binary-search-tree)

(defn singleton [val]
  {:value val})

(def value :value)
(def left :left)
(def right :right)

(defn insert [val tree]
  (let [add-node
        (fn [location node]
          (assoc tree location
                      (if node (insert val node)
                               (singleton val))))]
    (if (<= val (value tree))
      (add-node :left (left tree))
      (add-node :right (right tree)))))

(defn from-list [[root & rest-nodes :as nodes]]
  (reduce #(insert %2 %1) (singleton root) rest-nodes))

(defn in-order [tree]
  (if tree
    (concat (in-order (left tree))
            [(value tree)]
            (in-order (right tree)))
    []))