every?

added
1.0

ns
clojure.core

type
function

(every? pred coll)

Returns true if (pred x) is logical true for every x in coll, else
false.

                user=> (every? even? '(2 4 6))
true
user=> (every? even? '(1 2 3))
false
            
                ;; you can use every? with a set as the predicate to return true if 
;; every member of a collection is in the set
user=> (every? #{1 2} [1 2 3])
false
user=> (every? #{1 2} [1 2])
true

;; or use a hash-map as the predicate with every? to return true 
;; if every member of a collection is a key within the map
user=> (every? {1 "one" 2 "two"} [1 2])
true
user=> (every? {1 "one" 2 "two"} [1 2 3])
false
            
                ;; this is kind of weird IMO... but it works that way (the same for vectors)
;; See: https://en.wikipedia.org/wiki/Vacuous_truth
user=> (every? true? '())
true
user=> (every? false? '())
true

;; As such a better description of every? would be

;; Returns false if there exists a value x in coll 
;; such that (pred? x) is false, else true."
            
                ;; every? can replace clojure.set/subset? if and only if
;; the sets do not contain false / nil values

(subset? #{1}   #{1 2}) ;;=> true
(every?  #{1 2} #{1}  ) ;;=> true ✔

(subset? #{1 3} #{1 2}) ;;=> false
(every?  #{1 2} #{1 3}) ;;=> false ✔

;; however, invoking a set with a value returns the matched element,
;; causing the comparison below to fail

(subset? #{true false} #{true false}) ;;=> true
(every?  #{true false} #{true false}) ;;=> false ✘ 😦