『java.nio.file.Pathをslurp/spitで使えるようにする』からの続き。
clojure.java.ioのmake-parents/file/as-relative-path はString、File、URI、URLなどを対象とする多相的な関数だが、java7で追加された java.nio.file.Pathは対象に入っていない。
ということでPathも扱えるようにするためのメモ。
clojure.java.ioとCoercions
make-parents/file/as-relative-path関数の引数はプロトコル Coercionsを実装している必要がある。
以下のようにextenders関数で Coercions を実装している型一覧を確認することができる。
(extenders clojure.java.io/Coercions)
;;=> (nil java.lang.String java.io.File java.net.URL java.net.URI)
java.nio.file.PathにCoercionsを実装
extend関数に対象の型、プロトコル、実装する関数名と関数のマップを指定する。
(require '[clojure.java.io :as jio])
(extend java.nio.file.Path
jio/Coercions
{:as-file (fn [this]
(.toFile this))
:as-url (fn [this]
(.. this (toUri) (toURL)))})
以上でPathに対してもmake-parents/file/as-relative-path関数が利用できるようになる。