How would one write the function bytes? that returns the following:
(bytes? [1 2 3]) ;; => false
(bytes? (byte-array 8)) ;; => true
The way I used to do this until now was creating an array of that type and testing for it's class. To prevent creating an unnecessary instance every time, make a function that closes over the class of that particular array type.
(defn test-array
[t]
(let [check (type (t []))]
(fn [arg] (instance? check arg))))
(def byte-array?
(test-array byte-array))
=> (byte-array? (byte-array 8))
true
=> (byte-array? [1 2 3])
false
Mobyte's example seems a lot simpler though, and it seems I'll have some refactoring to do where I used this :)
(defn bytes? [x]
(if (nil? x)
false
(= (Class/forName "[B")
(.getClass x))))
Update. The same question has been already asked here Testing whether an object is a Java primitive array in Clojure. And google gives exactly that page on your question "how to check if a clojure object is a byte-array?" ;)
(Class/forName "[B") can be moved into a var like (def ^{:private true} bytes-class (Class/forName "[B")). This was you pay var dereferencing cost instead of reflection cost at runtime. I don't know which one is worse. Also AFAIK ^:const doesn't work in this case.