store/[org.clojure/clojure "1.8.0"] clj::clojure.core/complement

Official Documentation

Add notes
Arities
==================================================
   [f]

Docstring
==================================================
  Takes a fn f and returns a fn that takes the same arguments as f,
  has the same effects, if any, and returns the opposite truth value.

Source

(defn complement
  "Takes a fn f and returns a fn that takes the same arguments as f,
  has the same effects, if any, and returns the opposite truth value."
  {:added "1.0"
   :static true}
  [f] 
  (fn 
    ([] (not (f)))
    ([x] (not (f x)))
    ([x y] (not (f x y)))
    ([x y & zs] (not (apply f x y zs)))))

Example 1

Edit
;; a simple not-empty? predicate
(def not-empty? (complement empty?))
;; => #'user/not-empty?

(not-empty? [])
;; => false

(not-empty? [1 2])
;; => true

;; a slightly more complex example
;; this function takes two arguments, and sometimes returns nil

(defn contains-char? [the-string, the-char]
  (some #(= the-char %) the-string))
;; => #'user/contains-char?

(contains-char? "abc" \b)
;; => true

(contains-char? "abc" \j)
;; => nil

;; define the complement, to check if a char is absent
(def does-not-contain-char? (complement contains-char?))
;; => #'user/does-not-contain-char?

;; our complement does exactly what we expect
(does-not-contain-char? "abc" \b)
;; => false

(does-not-contain-char? "abc" \j)
;; => true

Uses on crossclj