aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/pred/pred.clj
blob: b654a5e8829aeb294a0c6213a692861912f49018 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
;;  Copyright (c) Stephen C. Gilardi. All rights reserved.
;;  The use and distribution terms for this software are covered by the
;;  Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
;;  which can be found in the file CPL.TXT 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.
;;
;;  pred.clj
;;
;;  Some clojure predicates
;;
;;  scgilardi (gmail)
;;  28 June 2008

(clojure/in-ns 'clojure.contrib.pred)
(clojure/refer 'clojure)

(defn coll?
  "Returns true if x implements IPersistentCollection"
  [x]
  (instance? clojure.lang.IPersistentCollection x))

(defn list?
  "Returns true if x implements IPersistentList"
  [x]
  (instance? clojure.lang.IPersistentList x))

;; map

(defn set?
  "Returns true if x implements IPersistentSet"
  [x]
  (instance? clojure.lang.IPersistentSet x))

(defn stack?
  "Returns true if x implements IPersistentStack"
  [x]
  (instance? clojure.lang.IPersistentStack x))

;; vector

(defn ref?
  "Returns true if x implements IRef"
  [x]
  (instance? clojure.lang.IRef x))

;; seq
;; var

(defn map-entry?
  "Returns true if x is a MapEntry"
  [x]
  (instance? clojure.lang.MapEntry x))

(defn atom?
  "Returns true if x is not a collection"
  [x]
  (not (coll? x)))

(defn number?
  "Returns true if x is a Number"
  [x]
  (instance? Number x))

(defn ratio?
  "Returns true if x is a Ratio"
  [x]
  (instance? clojure.lang.Ratio x))

(defn range?
  "Returns true if x is a Range"
  [x]
  (instance? clojure.lang.Range x))

(defn function?
  "Returns true if x implements IFn"
  [x]
  (instance? clojure.lang.IFn x))

(defmacro macro?
  "Returns true if x is a function and the symbol of the
  same name can be resolved and has its :macro metadata
  set"
  [x]
  `(and (function? ~x) (boolean (:macro ^#'~x))))

(defn integer?
  "Returns true if x is an integer"
  [x]
  (or (instance? Integer x)
      (instance? Long x)
      (instance? BigInteger x)))

(defn even?
  "Returns true if x is even, throws an exception if x is not an integer"
  [x]
  (zero? (bit-and x 1)))

(defn odd?
  "Returns true if x is odd, throws an exception if x is not an integer"
  [x]
  (not (even? x)))

(defn empty?
  "Returns true if coll is empty"
  [coll]
  (not (seq coll)))