(defn partition-nums
"partition a collection of numbers into groups"
[coll]
(loop [left coll
grouped []]
(let [cur-num (first left) ;;the num to be partitioned
last-group (last grouped)
last-num-of-last-group (last last-group)]
(cond
(nil? cur-num) grouped
(or (nil? last-num-of-last-group)
(< 3 (- cur-num last-num-of-last-group)))
(recur (next left) (conj grouped [cur-num]))
:else (recur
(next left)
(update-in grouped [(dec (count grouped))] conj cur-num))))))
(deftest test-partition-nums
(is (= [[1 2] [6]] (partition-nums [1 2 6])))
(is (= [[1 2 3] [7 8 9] [13 13 14]] (partition-nums [1 2 3 7 8 9 13 13 14]))))