六 月
23
土曜日

java.nio.file.Pathをmake-parents/file/as-relative-pathで使えるようにする

『java.nio.file.Pathをslurp/spitで使えるようにする』からの続き。

clojure.java.iomake-parents/file/as-relative-pathStringFileURIURLなどを対象とする多相的な関数だが、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関数が利用できるようになる。