Skip to content

Instantly share code, notes, and snippets.

@arrdem
Created July 31, 2016 05:34
Show Gist options
  • Save arrdem/7638ec030839ae107ee2e71709c45574 to your computer and use it in GitHub Desktop.
Save arrdem/7638ec030839ae107ee2e71709c45574 to your computer and use it in GitHub Desktop.
(definterface IModifier
(op [])
(value []))
(deftype ABuff [^long n]
IModifier
(op [_] (fn [m] (long (+ n m))))
(value [_] n)
Object
(toString [_] (format "#mod/+ %d" n)))
(deftype ADebuff [^long n]
IModifier
(op [_] (fn [m] (long (max 0 (- m n)))))
(value [_] n)
Object
(toString [_] (format "#mod/- %d" n)))
(deftype AMultiplier [^long n]
IModifier
(op [_] (fn [m] (long (* n m))))
(value [_] n)
Object
(toString [_] (format "#mod/* %d" n)))
(deftype ADivider [^long n]
IModifier
(op [_] (fn [m] (Math/floor (double (/ (double m) (double n))))))
(value [_] n)
Object
(toString [_] (format "#mod// %d" n)))
(defmethod print-method IModifier [o ^Writer w]
(.write w (.toString ^IModifier o)))
(def ^:private class->n
{AMultiplier 0, ADivider 1, ABuff 2, ADebuff 3})
(defn compare-modifiers [a b]
{:pre [(instance? IModifier a)
(instance? IModifier b)]}
(compare (class->n (class a))
(class->n (class b))))
(defn apply-modifiers [modifiers n]
(->> modifiers
(sort-by identity compare-modifiers)
(reduce (fn [n mod]
((.op ^IModifier mod) n)) n)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment