typecode
ClojureData Structures/inventory.clj
1(ns inventory.core)
2
3(defn create-store []
4 (atom {:products {}
5 :categories #{}
6 :next-id 1}))
7
8(defn add-product [store product]
9 (let [id (:next-id @store)]
10 (swap! store
11 (fn [state]
12 (-> state
13 (assoc-in [:products id]
14 (assoc product :id id))
15 (update :categories conj (:category product))
16 (update :next-id inc))))
17 id))
18
19(defn find-products [store pred]
20 (->> @store
21 :products
22 vals
23 (filter pred)
24 (sort-by :name)))
25
26(defn by-category [store category]
27 (find-products store
28 #(= (:category %) category)))
29
30(defn update-price [store id modifier]
31 (swap! store
32 update-in [:products id :price] modifier))
33
34(defn price-stats [store]
35 (let [prices (->> @store
36 :products
37 vals
38 (map :price))]
39 (when (seq prices)
40 {:min (apply min prices)
41 :max (apply max prices)
42 :avg (/ (reduce + prices) (count prices))
43 :count (count prices)})))
44
45(defn apply-discount [store category percent]
46 (let [factor (- 1.0 (/ percent 100.0))
47 products (by-category store category)]
48 (doseq [product products]
49 (update-price store (:id product)
50 #(* % factor)))
51 (count products)))
52
53(defn inventory-report [store]
54 (let [products (vals (:products @store))]
55 (->> products
56 (group-by :category)
57 (map (fn [[cat items]]
58 {:category cat
59 :count (count items)
60 :total-value (->> items
61 (map :price)
62 (reduce +))
63 :avg-price (/ (->> items
64 (map :price)
65 (reduce +))
66 (count items))}))
67 (sort-by :total-value >))))
0WPM
100%Accuracy
00:00Time
0%
Progress