Closureによる部分リスト検索(遅延評価)

前エントリの部分リスト検索ですが、別に :all を使わなくとも遅延評価してしまえばいいやということでやってみたら、こんな感じになりました。

(defn indexof
  [coll subcoll & from]
  (let [sub (seq subcoll) length (count sub)
        head (first from) head (cond (nil? head) 0 (< head 0) 0 :else head) ]
    (letfn [(func [i coll]
      (lazy-seq
        (when (not (empty? coll))
          (if (= sub (first (partition length coll)))
            (cons i (func (inc i) (next coll)))
            (func (inc i) (next coll))))))]
      (if (empty? from)
        (func 0 coll)
        (func head (drop head coll)))
    )))

(indexof "たけやのたけやぶにたけたてかけた" "け")
=>(1 5 10 14)

(class (indexof "たけやのたけやぶにたけたてかけた" "け"))
=>clojure.lang.LazySeq

まだサクッとは書けないなぁ…