        (cljs.core/>= y (first more)))
      false)))
 
-(defn dec
+(defn ^number dec
   "Returns a number one less than num."
   [x] (- x 1))
 
-(defn max
+(defn ^number max
   "Returns the greatest of the nums."
   ([x] x)
   ([x y] (cljs.core/max x y))
   ([x y & more]
    (reduce max (cljs.core/max x y) more)))
 
-(defn min
+(defn ^number min
   "Returns the least of the nums."
   ([x] x)
   ([x y] (cljs.core/min x y))
   ([x y & more]
    (reduce min (cljs.core/min x y) more)))
 
-(defn byte [x] x)
+(defn ^number byte [x] x)
 
 (defn char
   "Coerce to char"

    [this a b c d e f g h i j k l m n o p q s t rest]))

(defprotocol ICounted
  (-count [coll] "constant time count"))

(defprotocol IEmptyableCollection
  (-empty [coll]))

    (and (string? x) (== (.-length x) 1)) x
    :else (throw (js/Error. "Argument to char must be a character or number"))))

(defn ^number short [x] x)
(defn ^number float [x] x)
(defn ^number double [x] x)

(defn ^number unchecked-byte [x] x)
(defn ^number unchecked-char [x] x)
(defn ^number unchecked-short [x] x)
(defn ^number unchecked-float [x] x)
(defn ^number unchecked-double [x] x)

(defn ^number unchecked-add
  "Returns the sum of nums. (+) returns 0."
  ([] 0)
  ([x] x)
  ([x y] (cljs.core/unchecked-add x y))
  ([x y & more] (reduce unchecked-add (cljs.core/unchecked-add x y) more)))

(defn ^number unchecked-add-int
  "Returns the sum of nums. (+) returns 0."
  ([] 0)
  ([x] x)
  ([x y] (cljs.core/unchecked-add-int x y))
  ([x y & more] (reduce unchecked-add-int (cljs.core/unchecked-add-int x y) more)))

(defn ^number unchecked-dec [x]
  (cljs.core/unchecked-dec x))

(defn ^number unchecked-dec-int [x]
  (cljs.core/unchecked-dec-int x))

(defn ^number unchecked-divide-int
  "If no denominators are supplied, returns 1/numerator,
  else returns numerator divided by all of the denominators."
  ([x] (unchecked-divide-int 1 x))
  ([x y] (cljs.core/divide x y)) ;; FIXME: waiting on cljs.core//
  ([x y & more] (reduce unchecked-divide-int (unchecked-divide-int x y) more)))

(defn ^number unchecked-inc [x]
  (cljs.core/unchecked-inc x))

(defn ^number unchecked-inc-int [x]
  (cljs.core/unchecked-inc-int x))

(defn ^number unchecked-multiply
  "Returns the product of nums. (*) returns 1."
  ([] 1)
  ([x] x)
  ([x y] (cljs.core/unchecked-multiply x y))
  ([x y & more] (reduce unchecked-multiply (cljs.core/unchecked-multiply x y) more)))

(defn ^number unchecked-multiply-int
  "Returns the product of nums. (*) returns 1."
  ([] 1)
  ([x] x)
  ([x y] (cljs.core/unchecked-multiply-int x y))
  ([x y & more] (reduce unchecked-multiply-int (cljs.core/unchecked-multiply-int x y) more)))

(defn ^number unchecked-negate [x]
  (cljs.core/unchecked-negate x))

(defn ^number unchecked-negate-int [x]
  (cljs.core/unchecked-negate-int x))

(declare mod)

(defn ^number unchecked-remainder-int [x n]
  (cljs.core/unchecked-remainder-int x n))

(defn ^number unchecked-substract
  "If no ys are supplied, returns the negation of x, else subtracts
  the ys from x and returns the result."
  ([x] (cljs.core/unchecked-subtract x))
  ([x y] (cljs.core/unchecked-subtract x y))
  ([x y & more] (reduce unchecked-substract (cljs.core/unchecked-subtract x y) more)))

(defn ^number unchecked-substract-int
  "If no ys are supplied, returns the negation of x, else subtracts
  the ys from x and returns the result."
  ([x] (cljs.core/unchecked-subtract-int x))
  ([x y] (cljs.core/unchecked-subtract-int x y))
  ([x y & more] (reduce unchecked-substract-int (cljs.core/unchecked-subtract-int x y) more)))

(defn- ^number fix [q]
  (if (>= q 0)
    (Math/floor q)
    (Math/ceil q)))

(defn ^number int
  "Coerce to int by stripping decimal places."
  [x]
  (bit-or x 0))

(defn ^number unchecked-int
  "Coerce to int by stripping decimal places."
  [x]
  (fix x))

(defn ^number long
  "Coerce to long by stripping decimal places. Identical to `int'."
  [x]
  (fix x))

(defn ^number unchecked-long
  "Coerce to long by stripping decimal places. Identical to `int'."
  [x]
  (fix x))
