        (println ~msg)
        result#)))
 
+(t/ann log-io (t/All [x y ...] [String [y ... y -> x] -> [y ... y -> x]]))
 (defn log-io
   "Log function inputs and outputs by wrapping an function f."
   [msg f]

    [arg [sym] condition form else-form]
    (arg-if- 'clojure.core/-> arg sym condition form else-form)))

(defn vec-match?
  [test-expr expr]
  (let [arg-match? (fn [[test-term term]]
    (cond
      (fn? test-term)  (test-term term)
      (= :* test-term) true

(t/ann ^:no-check taoensso.timbre/refer-timbre [-> t/Any])
(timbre/refer-timbre)

(t/ann ^:no-check clojure.data.generators/uniform [Long Long -> Long])
(t/ann uniform-int (t/IFn [Long -> Long]
                          [Long Long -> Long]))
(defn uniform-int
 ([hi] {:pre [(pos? hi)]} (uniform-int 0 hi))
 ([lo hi] {:pre [(< lo hi)]} (dg/uniform lo hi)))

(defmacro log-time
  "Log the time it takes to execute body."
