aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clojure/contrib/accumulators.clj20
-rw-r--r--src/clojure/contrib/accumulators/examples.clj33
-rw-r--r--src/clojure/contrib/probabilities/dist/examples.clj4
3 files changed, 38 insertions, 19 deletions
diff --git a/src/clojure/contrib/accumulators.clj b/src/clojure/contrib/accumulators.clj
index a0a883da..93a13037 100644
--- a/src/clojure/contrib/accumulators.clj
+++ b/src/clojure/contrib/accumulators.clj
@@ -1,7 +1,7 @@
;; Accumulators
;; by Konrad Hinsen
-;; last updated January 22, 2009
+;; last updated February 3, 2009
;; This module defines various accumulators (list, vector, map,
;; sum, product, counter, and combinations thereof) with a common
@@ -34,8 +34,8 @@
:arglists '([acc item])}
add selector)
-(defn add-coll
- "Add all elements of the collection coll to the accumulator acc."
+(defn add-items
+ "Add all elements of a collection coll to the accumulator acc."
[acc items]
(reduce add acc items))
@@ -75,6 +75,20 @@
(conj v e))
;
+; Queue accumulator
+;
+(defvar empty-queue clojure.lang.PersistentQueue/EMPTY
+ "An empty queue accumulator. Adding an item appends it at the end.")
+
+(defmethod combine clojure.lang.PersistentQueue
+ [& vs]
+ (add-items (first vs) (apply concat (rest vs))))
+
+(defmethod add clojure.lang.PersistentQueue
+ [v e]
+ (conj v e))
+
+;
; Set accumulator
;
(defvar empty-set #{}
diff --git a/src/clojure/contrib/accumulators/examples.clj b/src/clojure/contrib/accumulators/examples.clj
index 3821ca88..a3d7b026 100644
--- a/src/clojure/contrib/accumulators/examples.clj
+++ b/src/clojure/contrib/accumulators/examples.clj
@@ -11,48 +11,53 @@
; Vector accumulator: combine is concat, add is conj
(combine [:a :b] [:c :d] [:x :y])
(add [:a :b] :c)
-(add-coll empty-vector [:a :b :a])
+(add-items empty-vector [:a :b :a])
; List accumulator: combine is concat, add is conj
(combine '(:a :b) '(:c :d) '(:x :y))
(add '(:a :b) :c)
-(add-coll empty-list [:a :b :a])
+(add-items empty-list [:a :b :a])
+
+; Queue accumulator
+(let [q1 (add-items empty-queue [:a :b :a])
+ q2 (add-items empty-queue [:x :y])]
+ (combine q1 q2))
; Set accumulator: combine is union, add is conj
(combine #{:a :b} #{:c :d} #{:a :d})
(add #{:a :b} :c)
-(add-coll empty-set [:a :b :a])
+(add-items empty-set [:a :b :a])
; Map accumulator: combine is merge, add is conj
(combine {:a 1} {:b 2 :c 3} {})
(add {:a 1} [:b 2])
-(add-coll empty-map [[:a 1] [:b 2] [:a 0]])
+(add-items empty-map [[:a 1] [:b 2] [:a 0]])
; Counter accumulator
-(let [c1 (add-coll empty-counter [:a :b :a])
- c2 (add-coll empty-counter [:x :y])]
+(let [c1 (add-items empty-counter [:a :b :a])
+ c2 (add-items empty-counter [:x :y])]
(combine c1 c2))
; Counter-with-total accumulator
-(let [c1 (add-coll empty-counter-with-total [:a :b :a])
- c2 (add-coll empty-counter-with-total [:x :y])]
+(let [c1 (add-items empty-counter-with-total [:a :b :a])
+ c2 (add-items empty-counter-with-total [:x :y])]
(combine c1 c2))
; Sum accumulator: combine is addition
-(let [s1 (add-coll empty-sum [1 2 3])
- s2 (add-coll empty-sum [-1 -2 -3])]
+(let [s1 (add-items empty-sum [1 2 3])
+ s2 (add-items empty-sum [-1 -2 -3])]
(combine s1 s2))
; Product accumulator: combine is multiplication
-(let [p1 (add-coll empty-product [2 3])
- p2 (add-coll empty-product [(/ 1 2)])]
+(let [p1 (add-items empty-product [2 3])
+ p2 (add-items empty-product [(/ 1 2)])]
(combine p1 p2))
; String accumulator: combine is concatenation
(combine "a" "b" "c" "def")
(add "a" (char 44))
-(add-coll empty-string [(char 55) (char 56) (char 57)])
+(add-items empty-string [(char 55) (char 56) (char 57)])
; Accumulator tuples permit to update several accumulators in parallel
(let [pair (empty-tuple [empty-vector empty-string])]
- (add-coll pair [[1 "a"] [2 "b"]]))
+ (add-items pair [[1 "a"] [2 "b"]]))
diff --git a/src/clojure/contrib/probabilities/dist/examples.clj b/src/clojure/contrib/probabilities/dist/examples.clj
index 8012d11a..6fb1b5be 100644
--- a/src/clojure/contrib/probabilities/dist/examples.clj
+++ b/src/clojure/contrib/probabilities/dist/examples.clj
@@ -64,14 +64,14 @@
; Using an ordinary counter:
(def dist1
(normalize
- (clojure.contrib.accumulators/add-coll
+ (clojure.contrib.accumulators/add-items
clojure.contrib.accumulators/empty-counter
(for [_ (range 1000)] (rand-int 5)))))
; Or, more efficiently, using a counter that already keeps track of its total:
(def dist2
(normalize
- (clojure.contrib.accumulators/add-coll
+ (clojure.contrib.accumulators/add-items
clojure.contrib.accumulators/empty-counter-with-total
(for [_ (range 1000)] (rand-int 5)))))