/ / No Clojure como posso implementar interfaces de coleção padrão do Clojure em meus próprios registros e tipos? - clojure

No Clojure, como posso implementar interfaces de coleção padrão do Clojure em meus próprios registros e tipos? - clojure

Desejo criar uma abstração que represente uma tabela de banco de dados, mas que possa ser acessada usando todos os Clojure seq e conj usuais e todas essas coisas extravagantes. Existe um protocolo que preciso adicionar?

Respostas:

15 para resposta № 1

Sim. O protocolo é definido pela interface Java clojure.lang.ISeq. Você pode querer estender clojure.lang.ASeq que fornece uma implementação abstrata do mesmo.

Aqui está um exemplo: seq abstração de um recurso que pode ser fechado e é fechado automaticamente quando o seq termina. (Não rigorosamente testado)

(deftype CloseableSeq [delegate-seq close-fn]
clojure.lang.ISeq
(next [this]
(if-let [n (next delegate-seq)]
(CloseableSeq. n close-fn)
(.close this)))
(first [this] (if-let [f (first delegate-seq)] f (.close this)))
(more [this] (if-let [n (next this)] n "()))
(cons [this obj] (CloseableSeq. (cons obj delegate-seq) close-fn))
(count [this] (count delegate-seq))
(empty [this] (CloseableSeq. "() close-fn))
(equiv [this obj] (= delegate-seq obj))
clojure.lang.Seqable
(seq [this] this)
java.io.Closeable
(close [this] (close-fn)))