ST
(defn iterate-while
([f x] (iterate-while some? f x))
([pred f x]
(when (pred x)
(reify
ISeq
(first [_] x)
(next [_] (iterate-while pred f (f x)))
(more [this] (or (next this) '()))
Seqable
(seq [this] this)
IReduceInit
(reduce [_ rf ret]
(loop [ret ret, x x]
(cond (reduced? ret) (.deref ^Reduced ret)
(pred x),,,,,, (recur (rf ret x) (f x))
:else,,,,,,,,, ret)))
Sequential))))