Взаимодействие из clojure a с нестандартным -итеративным Java API

Я работаю в clojure с классом java, который предоставляет API поиска для двоичного файла, специфичного для домена, содержащего серию записей.

Класс java инициализируется файлом, а затем предоставляет метод .query, который возвращает экземпляр внутреннего класса, который имеет только один метод .next, что не очень хорошо сочетается с обычным API коллекций java. Ни внешний, ни внутренний класс не реализуют никакого интерфейса.

Метод .queryможет возвращать null вместо внутреннего класса. Метод .nextвозвращает строку записи или null, если больше записей не найдено, он может вернуть null сразу после первого вызова.

Как заставить этот java API хорошо работать из clojure без написания дополнительных классов java?

Лучшее, что я смог придумать, это:


(defn get-records
  [file query-params]
  (let [tr (JavaCustomFileReader. file)]
    (if-let [inner-iter (.query tr query-params)] ;.query may return null                                                               
      (loop [it inner-iter
             results []]
       (if-let [record (.next it)]
         (recur it (conj results record))
         results))
      [])))

Это дает мне вектор результатов для работы с абстракциями clojure seq. Существуют ли другие способы предоставления последовательности из java API, либо с помощью ленивой последовательности -, либо с использованием протоколов?

5
задан Alex Stoddard 10 July 2012 в 13:09
поделиться