     [arg [sym] condition form else-form]
     (arg-if- 'clojure.core/-> arg sym condition form else-form)))
 
-(t/ann vec-match? [(t/Vec t/Any) (t/Vec t/Any) -> Boolean])
+(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

  `(condp vec-match? ~match
     ~@body))

(t/ann noun->indefinite-article (t/Pred String))
(defn noun->indefinite-article [noun] (if (contains? #{\a \e \i \o \u} (first noun))
                                        "an"
                                        "a"))
(t/defalias Pos (t/HMap :mandatory {:x Integer :y Integer}))

(t/ann pos->xy (t/IFn [Pos -> (t/Vec Number)]))
(defn pos->xy
  [{x :x y :y}]
  [x y])

(t/ann xy->pos (t/IFn [Number Number -> Pos]))
(defn xy->pos
  [x y]
  {:x x :y y})

(t/ann chebyshev-distance (t/IFn [Pos Pos -> Number]))
(defn chebyshev-distance
  "Chebyshev/chessboard distance between 2 points"
  [p1 p2]
  (max (Math/abs (- (:x p1) (:x p2)))
       (Math/abs (- (:y p1) (:y p2)))))

(t/ann distance-sq (t/IFn [Pos Pos -> Number]))
(defn distance-sq
  [p1 p2]
  (let [sq (fn [x] (* x x))]
  (+ (sq (- (:x p1) (:x p2)))
     (sq (- (:y p1) (:y p2))))))

(t/ann distance (t/IFn [Pos Pos -> Number]))
(defn distance
  "Euclidean distance between 2 points"
  [p1 p2]

  [p1 p2 l]
  (> (distance-sq p1 p2) (* l l)))

(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
