Last active
December 11, 2015 08:28
-
-
Save fredyr/4573000 to your computer and use it in GitHub Desktop.
Gilded rose in Clojure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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