diff options
author | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-02-08 17:29:44 +0000 |
---|---|---|
committer | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-02-08 17:29:44 +0000 |
commit | 9bb63b7b8cd0bdbdee32ac71d7aeab9405acf3a2 (patch) | |
tree | f2fdb4b018883aeb28b3cff13c55b548dcb14477 | |
parent | 4e820101c55e7bd6340c334bd419f91b4e21bfc9 (diff) |
accumulators: renamed add-coll to add-items and added queue accumulator
-rw-r--r-- | src/clojure/contrib/accumulators.clj | 20 | ||||
-rw-r--r-- | src/clojure/contrib/accumulators/examples.clj | 33 | ||||
-rw-r--r-- | src/clojure/contrib/probabilities/dist/examples.clj | 4 |
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))))) |