<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="../../coverage.css"/> <title> the_great_game/merchants/merchant_utils.clj </title> </head> <body> <span class="covered" title="1 out of 1 forms covered"> 001 (ns the-great-game.merchants.merchant-utils </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 002 "Useful functions for doing low-level things with merchants.") </span><br/> <span class="blank" title="0 out of 0 forms covered"> 003 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 004 (defn expected-price </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 005 "Find the price anticipated, given this `world`, by this `merchant` for </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 006 this `commodity` in this `city`. If no information, assume 1. </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 007 `merchant` should be passed as a map, `commodity` and `city` should be passed as keywords." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 008 [merchant commodity city] </span><br/> <span class="covered" title="5 out of 5 forms covered"> 009 (or </span><br/> <span class="covered" title="2 out of 2 forms covered"> 010 (:price </span><br/> <span class="covered" title="2 out of 2 forms covered"> 011 (last </span><br/> <span class="covered" title="3 out of 3 forms covered"> 012 (sort-by </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 013 :date </span><br/> <span class="covered" title="7 out of 7 forms covered"> 014 (-> merchant :known-prices city commodity)))) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 015 1)) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 016 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 017 (defn burden </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 018 "The total weight of the current cargo carried by this `merchant` in this </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 019 `world`." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 020 [merchant world] </span><br/> <span class="covered" title="4 out of 4 forms covered"> 021 (let [m (cond </span><br/> <span class="covered" title="3 out of 3 forms covered"> 022 (keyword? merchant) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 023 (-> world :merchants merchant) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 024 (map? merchant) </span><br/> <span class="covered" title="1 out of 1 forms covered"> 025 merchant) </span><br/> <span class="covered" title="8 out of 8 forms covered"> 026 cargo (or (:stock m) {})] </span><br/> <span class="covered" title="3 out of 3 forms covered"> 027 (reduce </span><br/> <span class="covered" title="1 out of 1 forms covered"> 028 + </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 029 0 </span><br/> <span class="covered" title="3 out of 3 forms covered"> 030 (map </span><br/> <span class="covered" title="11 out of 11 forms covered"> 031 #(* (cargo %) (-> world :commodities % :weight)) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 032 (keys cargo))))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 033 </span><br/> <span class="blank" title="0 out of 0 forms covered"> 034 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 035 (defn can-carry </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 036 "Return the number of units of this `commodity` which this `merchant` </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 037 can carry in this `world`, given their current burden." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 038 [merchant world commodity] </span><br/> <span class="partial" title="3 out of 4 forms covered"> 039 (let [m (cond </span><br/> <span class="covered" title="3 out of 3 forms covered"> 040 (keyword? merchant) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 041 (-> world :merchants merchant) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 042 (map? merchant) </span><br/> <span class="covered" title="1 out of 1 forms covered"> 043 merchant)] </span><br/> <span class="covered" title="2 out of 2 forms covered"> 044 (max </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 045 0 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 046 (quot </span><br/> <span class="partial" title="12 out of 13 forms covered"> 047 (- (or (:capacity m) 0) (burden m world)) </span><br/> <span class="covered" title="7 out of 7 forms covered"> 048 (-> world :commodities commodity :weight))))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 049 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 050 (defn can-afford </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 051 "Return the number of units of this `commodity` which this `merchant` </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 052 can afford to buy in this `world`." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 053 [merchant world commodity] </span><br/> <span class="partial" title="3 out of 4 forms covered"> 054 (let [m (cond </span><br/> <span class="covered" title="3 out of 3 forms covered"> 055 (keyword? merchant) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 056 (-> world :merchants merchant) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 057 (map? merchant) </span><br/> <span class="covered" title="1 out of 1 forms covered"> 058 merchant) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 059 l (:location m)] </span><br/> <span class="covered" title="3 out of 3 forms covered"> 060 (cond </span><br/> <span class="covered" title="3 out of 3 forms covered"> 061 (nil? m) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 062 (throw (Exception. "No merchant?")) </span><br/> <span class="covered" title="14 out of 14 forms covered"> 063 (or (nil? l) (nil? (-> world :cities l))) </span><br/> <span class="covered" title="6 out of 6 forms covered"> 064 (throw (Exception. (str "No known location for merchant " m))) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 065 :else </span><br/> <span class="covered" title="1 out of 1 forms covered"> 066 (quot </span><br/> <span class="covered" title="3 out of 3 forms covered"> 067 (:cash m) </span><br/> <span class="covered" title="9 out of 9 forms covered"> 068 (-> world :cities l :prices commodity))))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 069 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 070 (defn add-stock </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 071 "Where `a` and `b` are both maps all of whose values are numbers, return </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 072 a map whose keys are a union of the keys of `a` and `b` and whose values </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 073 are the sums of their respective values." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 074 [a b] </span><br/> <span class="covered" title="2 out of 2 forms covered"> 075 (reduce </span><br/> <span class="covered" title="1 out of 1 forms covered"> 076 merge </span><br/> <span class="covered" title="1 out of 1 forms covered"> 077 a </span><br/> <span class="covered" title="3 out of 3 forms covered"> 078 (map </span><br/> <span class="partial" title="19 out of 20 forms covered"> 079 #(hash-map % (+ (or (a %) 0) (or (b %) 0))) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 080 (keys b)))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 081 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 082 (defn add-known-prices </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 083 "Add the current prices at this `merchant`'s location in the `world` </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 084 to a new cache of known prices, and return it." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 085 [merchant world] </span><br/> <span class="not-covered" title="0 out of 4 forms covered"> 086 (let [m (cond </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 087 (keyword? merchant) </span><br/> <span class="not-covered" title="0 out of 5 forms covered"> 088 (-> world :merchants merchant) </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 089 (map? merchant) </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 090 merchant) </span><br/> <span class="not-covered" title="0 out of 8 forms covered"> 091 k (or (:known-prices m) {}) </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 092 l (:location m) </span><br/> <span class="not-covered" title="0 out of 8 forms covered"> 093 d (or (:date world) 0) </span><br/> <span class="not-covered" title="0 out of 7 forms covered"> 094 p (-> world :cities l :prices)] </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 095 (cond </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 096 (nil? m) </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 097 (throw (Exception. "No merchant?")) </span><br/> <span class="not-covered" title="0 out of 14 forms covered"> 098 (or (nil? l) (nil? (-> world :cities l))) </span><br/> <span class="not-covered" title="0 out of 6 forms covered"> 099 (throw (Exception. (str "No known location for merchant " m))) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 100 :else </span><br/> <span class="not-covered" title="0 out of 2 forms covered"> 101 (reduce </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 102 merge </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 103 k </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 104 (map </span><br/> <span class="not-covered" title="0 out of 17 forms covered"> 105 #(hash-map % (apply vector cons {:price (p %) :date d} (k %))) </span><br/> <span class="not-covered" title="0 out of 5 forms covered"> 106 (-> world :commodities keys)))))) </span><br/> </body> </html>