/data/train/clojure/585fef480ff6366ab1fc1088fa62c2a89121b8cdprotocols.clj

https://github.com/aliostad/deep-learning-lang-detection · Clojure · 67 lines · 58 code · 9 blank · 0 comment · 7 complexity · 83008ec190355eae8d852c71412293ee MD5 · raw file

  1. (ns programming-clojure.protocols
  2. (:import (java.lang StringBuilder)
  3. (java.io FileInputStream InputStreamReader BufferedReader FileOutputStream
  4. OutputStreamWriter BufferedWriter InputStream OutputStream File)
  5. (java.net Socket URL)))
  6. (defprotocol IOFactory
  7. "A protocol for things that can be read from and written to."
  8. (make-reader [this] "Creates a BufferedReader.")
  9. (make-writer [this] "Creates a BufferedWriter."))
  10. (extend InputStream
  11. IOFactory
  12. {:make-reader (fn [src] (-> src InputStreamReader. BufferedReader.))
  13. :make-writer (fn [_] (throw (IllegalArgumentException. "Can't open as an InputStream")))})
  14. (extend OutputStream
  15. IOFactory
  16. {:make-reader (fn [_] (throw (IllegalArgumentException. "Can't open as an OutputStream")))
  17. :make-writer (fn [dst] (-> dst OutputStreamWriter. BufferedWriter.))})
  18. (extend-type File
  19. IOFactory
  20. (make-reader [src]
  21. (make-reader (FileInputStream. src)))
  22. (make-writer [dst]
  23. (make-writer (FileOutputStream. dst))))
  24. (extend-protocol IOFactory
  25. Socket
  26. (make-reader [src]
  27. (make-reader (.getInputStream src)))
  28. (make-writer [dst]
  29. (make-writer (.getOutputStream dst)))
  30. URL
  31. (make-reader [src]
  32. (if (= "file" (.getProtocol src))
  33. (-> src .getPath FileInputStream.)
  34. (.openStream src)))
  35. (make-writer [dst]
  36. (if (= "file" (.getProtocol dst))
  37. (-> dst .getPath FileOutputStream.)
  38. (throw (IllegalArgumentException.
  39. "Can't write to non-file URL"))))
  40. String
  41. (make-reader [src]
  42. (make-reader (FileInputStream. src)))
  43. (make-writer [dst]
  44. (make-writer (FileOutputStream. dst))))
  45. (defn gulp
  46. [src]
  47. (let [sb (StringBuilder.)]
  48. (with-open [reader (make-reader src)]
  49. (loop [c (.read reader)]
  50. (if (neg? c)
  51. (str sb)
  52. (do
  53. (.append sb (char c))
  54. (recur (.read reader))))))))
  55. (defn expectorate
  56. [dst content]
  57. (with-open [writer (make-writer dst)]
  58. (.write writer (str content))))