   [p1 p2 l]
   (> (distance-sq p1 p2) (* l l)))
 
-(t/ann fill-missing (t/All [x y z] (t/IFn [(t/Pred x)
-                                           (t/IFn [x y -> z])
-                                           (t/Seq y)
-                                           (t/Seq x) -> (t/Seq z)])))
+(t/ann fill-missing (t/All [x y z] [(t/Pred x)
+                                   (t/IFn [x y -> z])
+                                   (t/Seq y)
+                                   (t/Seq x) -> (t/Seq z)]))
                                    
 (defn fill-missing
   "For each item in coll for which (pred item) returns true, replace that

       (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]
  (fn [& args]
    (let [result (apply f args)]
      (println (format "(%s %s)=>%s" msg (str args) (str result)))
      result)))


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

(t/ann ^:no-check vec-match? [(t/Vec t/Any) (t/Vec t/Any) -> Boolean])
(defn vec-match?
  [test-expr expr]
  (let [arg-match? (t/fn [[test-term term] :- (t/I (t/Vec t/Any) (t/ExactCount 2))] :- Boolean
