λambder on software

This is my journey into the world of computer science and geekery.

;   Copyright (c) Daniel Kwiecinski. All rights reserved.
;   The use and distribution terms for this software are covered by the
;   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;   which can be found in the file epl-v10.html at the root of this distribution.
;   By using this software in any fashion, you are agreeing to be bound by
;   the terms of this license.
;   You must not remove this notice, or any other, from this software.
;
; Example of extending native Java array types to Clojure protocols


(defn array-of [t]
  (.getClass (java.lang.reflect.Array/newInstance t 0)))

(defprotocol P
  (ppp [it]))


(extend-type Object
  P
  (ppp [s]
    (format "<%s>" s)))

(extend-type String
  P
  (ppp [s]
    (format "\"%s\"" s)))


(extend-type (array-of Object)
  P
  (ppp [a]
    (apply str
      (flatten
        ["Array["
         (interpose ", "
           (map
             #(ppp %)
             a))
         "]"]))))
  
; => (ppp (to-array [1 2 3 4]))
; "Array[<1>, <2>, <3>, <4>]"
; => (ppp (to-array ["foo" "bar"]))
; "Array[\"foo\", \"bar\"]"

2 months ago