 
 (defn comparator_AZ_order [key1 key2]
   {:pre [ (assumedTrue (keyword? key1) (keyword? key2)) ]
-   } 
+   } 
+  (prn "comparatorAZ:" key1 key2 (keyword? key1) (keyword? key2)) 
   (compare key1 key2)
   )
 

(defn 
  ^:private
add_new_key [quoted_key_name thekey]
  (swap! -allkeys 
         assoc2
         quoted_key_name thekey

    )

(defmacro assumedTrue
  "will throw if any of the passed expressions evaluate to false or nil"
  [& all]
  `(do 
     (let [myname# '~(first &form) allp# '~(rest &form)]
       (cond (<= (count allp#) 0)
         (throw 
            (AssertionError. 
              (str "you passed no parameters to `" myname# "`"
                   )
              )
            )
         )
     (loop [allparams# allp#]
   (let [
         ;f# ~x eva# (eval f#) 
         ;allparams# '~(rest &form) 
         exactform# (first allparams#)
         evalled# (eval exactform#)
         ]
     ;(prn "all params:" '~(rest &form))
     (prn "exactform#:" exactform#)
     (prn "evalled:" evalled# "rest count:" (count allparams#))
     ;(prn "third:" evalled#)
     ;true)
      ;(prn "aT:" (quote ~x) f# eva#)
      (when-not evalled#
        (do
          (throw 
            (AssertionError. 
              (str 
                myname# " failed "
                exactform#
                " was "
                evalled#
;                (prn-str 
;                  exactform#
;                  "is" 
;                  evalled#)
                )
              )
            )
          )
        )
;      ~(prn "teh:" all)
;      true

      (cond (<= (count allparams#) 1);aka no more ;~@(empty? all)
        true
        :else
        (do 
          (prn "COUNT:" (count allparams#) "rest:" (rest allparams#))
          ( recur (rest allparams#))
          ;'(assumedTrue (rest allparams#))
          )
        )
     )
  )
)))

;TODO: make tests for this macro
;(assumedTrue 1 2 3 (> 2 1) (= :a :a) (= 1 2))
;(assumedTrue)

;(println *file*)

