/
set.clj
67 lines (61 loc) · 2.11 KB
/
set.clj
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
(ns
^{:doc "Random utilities, set support functions."
:author "Paweł Wilk"
:added "1.0.0"}
io.randomseed.utils.set
(:require [clojure.set :as set]))
(defn replace-in
[^clojure.lang.PersistentHashSet s old-val new-val]
(conj (disj s old-val) new-val))
(defn difference
([] [])
([of] of)
([of what]
(if (>= (count of) (count what))
(if (instance? clojure.lang.IEditableCollection of)
(with-meta (persistent! (reduce disj! (transient of) what)) (meta of))
(reduce disj of what))
(if (instance? clojure.lang.IEditableCollection of)
(with-meta
(persistent!
(reduce (fn [result item]
(if (contains? what item)
(disj! result item)
result))
(transient of) of))
(meta of))
(reduce (fn [result item]
(if (contains? what item)
(disj result item)
result))
of of))))
([of xform what]
(if (>= (count of) (count what))
(if (instance? clojure.lang.IEditableCollection of)
(with-meta (persistent! (transduce xform disj! (transient of) what)) (meta of))
(transduce xform disj of what))
(if (instance? clojure.lang.IEditableCollection of)
(with-meta
(persistent!
(transduce xform
(fn [result item]
(if (contains? what item)
(disj! result item)
result))
(transient of) of))
(meta of))))))
(defn out-of
([] [])
([of] of)
([of what]
(if (and (set? what) (set? of))
(difference of what)
(if (instance? clojure.lang.IEditableCollection of)
(with-meta (persistent! (reduce disj! (transient of) what)) (meta of))
(reduce disj of what))))
([of xform what]
(if (and (set? what) (set? of))
(difference of xform what)
(if (instance? clojure.lang.IEditableCollection of)
(with-meta (persistent! (transduce xform disj! (transient of) what)) (meta of))
(transduce xform disj of what)))))