                    ^:unsynchronized-mutable next]
   Advance
   (advance [_ n]
-    (loop [n n]
+    (loop [^long n n]
       (if-not (zero? n)
         (let [nnext (+ curr next)]
           (set! curr next)
           (set! next nnext)
-          (recur (dec n))
-          )))
+          (recur (dec n)))))
     curr))
 
 (defn fibo-with-type
-  [n]
+  [^long n]
   (advance (FiboType. 0N 1N) n))
 
 ; -----------------------------------------------
 
 (defn fibo-with-java
-  [n]
+  [^long n]
   (javaalg.algorithms.PerfFiboJava/fibs n))
+
+(defn fibo-recur-java-bigint
+  [^long n]
+  (loop [curr (BigInteger/valueOf 0)
+         next (BigInteger/valueOf 1)
+         n n]
+    (if-not (zero? n)
+      (recur next (.add curr next) (dec n))
+      curr)))
 
 ; -----------------------------------------------
 

(set! *warn-on-reflection* true)

(defn fibo-iterate
  [n]
  (let [next-fib (fn [[a b]] [b (+ a b)])
        fibs (iterate next-fib [0N 1N])]
    (first (nth fibs n))))

(defn fibo-lazy-seq
  [n]
  (letfn [(fibs [a b] (cons a (lazy-seq (fibs b (+ a b)))))]
    (nth (fibs 0N 1N) n)))

(defn fibo-recur
  [n]
  (loop [curr 0N
         next 1N
         n n]

    (run-bench (fibo-volatile n))
    (run-bench (fibo-with-type n))
    (run-bench (fibo-with-java n))
    (run-bench (fibo-recur-java-bigint n))
    #_(perf/quick-bench (fibo-lazy-cat n))
    ))
