Skip to content

Instantly share code, notes, and snippets.

@fredyr
Last active December 11, 2015 08:28
Show Gist options
  • Save fredyr/4573000 to your computer and use it in GitHub Desktop.
Save fredyr/4573000 to your computer and use it in GitHub Desktop.
Gilded rose in Clojure
; gilded.clj
; (def item {:name "Aged Brie" :sell-in 12 :quality 3})
(defn force-range [quality]
(cond
(< quality 0) 0
(> quality 50) 50
:else quality))
(defn backstage [quality sell-in]
(let [ranges [[0 0], [5 (+ quality 3)], [10 (+ quality 2)]]
condition (fn [[lower-range q]]
(if (<= sell-in lower-range) q))
adj-q (some condition ranges)]
(if adj-q adj-q (+ quality 1))))
(defn double-rate [quality sell-in sign]
(let [two (* 2 sign)
one (* 1 sign)]
(if (<= sell-in 0)
(+ quality two)
(+ quality one))))
(defn aged-brie [quality sell-in]
(double-rate quality sell-in 1))
(defn decrease-quality [quality sell-in]
(double-rate quality sell-in -1))
(defn sulfuras [quality sell-in]
quality)
(defn decrease-sell-in [value]
(- value 1))
(defn update-quality [{item-name :name, quality :quality, sell-in :sell-in}]
(let [quality-special-cases
{"Backstage passes to a TAFKAL80ETC concert" (comp force-range backstage)
"Aged Brie" (comp force-range aged-brie)
"Sulfuras, Hand of Ragnaros" sulfuras}
func (quality-special-cases item-name)]
(if func (func quality sell-in)
(force-range (decrease-quality quality sell-in)))))
(defn update-sell-in [{item-name :name, quality :quality, sell-in :sell-in}]
(let [sell-in-special-cases {"Sulfuras, Hand of Ragnaros" identity}
func (sell-in-special-cases item-name)]
(if func (func sell-in)
(decrease-sell-in sell-in))))
(defn update-single-item [item]
(let [q (update-quality item)
s (update-sell-in item)]
(-> item
(assoc :quality q)
(assoc :sell-in s))))
(defn update-items [items]
(map update-single-item items))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment