Skip to content

Instantly share code, notes, and snippets.

@crater2150
Last active March 5, 2019 11:49
Show Gist options
  • Save crater2150/0c2a76a791b0d9a790398a9ee19f970b to your computer and use it in GitHub Desktop.
Save crater2150/0c2a76a791b0d9a790398a9ee19f970b to your computer and use it in GitHub Desktop.
package model.attributes
import monocle.Iso
import monocle.macros.GenIso
final case class Stamina(value: Int) extends AnyVal
final case class Sanity(value: Int) extends AnyVal
final case class Speed(value: Int) extends AnyVal
final case class Sneak(value: Int) extends AnyVal
final case class Fight(value: Int) extends AnyVal
final case class Will(value: Int) extends AnyVal
final case class Lore(value: Int) extends AnyVal
final case class Luck(value: Int) extends AnyVal
final case class Combat(value: Int) extends AnyVal
final case class Evasion(value: Int) extends AnyVal
class IntegralAttr[T](iso:Iso[T, Int]) extends Integral[T] {
def plus(x: T, y: T): T = iso.reverseGet(iso.get(x) + iso.get(y))
def minus(x: T, y: T): T = iso.reverseGet(iso.get(x) - iso.get(y))
def times(x: T, y: T): T = iso.reverseGet(iso.get(x) * iso.get(y))
def quot(x: T, y: T): T = iso.reverseGet(iso.get(x) / iso.get(y))
def rem(x: T, y: T): T = iso.reverseGet(iso.get(x) % iso.get(y))
def negate(x: T): T = iso.reverseGet(-iso.get(x))
def fromInt(x: Int): T = iso.reverseGet(x)
def toInt(x: T): Int = iso.get(x)
def toLong(x: T): Long = iso.get(x).longValue
def toFloat(x: T): Float = iso.get(x).floatValue
def toDouble(x: T): Double = iso.get(x).doubleValue
override def compare(x: T, y: T): Int = iso.get(x).compareTo(iso.get(y))
}
object Implicits extends Numeric.ExtraImplicits {
implicit class AttributeOps[T](attr: T)(implicit val iso: Iso[T, Int]) extends IntegralAttr[T](iso)
implicit val sanityAttr: IntegralAttr[Sanity] = new IntegralAttr[Sanity](GenIso[Sanity,Int])
implicit val staminaAttr: IntegralAttr[Stamina] = new IntegralAttr[Stamina](GenIso[Stamina,Int])
implicit val speedAttr: IntegralAttr[Speed] = new IntegralAttr[Speed](GenIso[Speed,Int])
implicit val sneakAttr: IntegralAttr[Sneak] = new IntegralAttr[Sneak](GenIso[Sneak,Int])
implicit val fightAttr: IntegralAttr[Fight] = new IntegralAttr[Fight](GenIso[Fight,Int])
implicit val willAttr: IntegralAttr[Will] = new IntegralAttr[Will](GenIso[Will,Int])
implicit val loreAttr: IntegralAttr[Lore] = new IntegralAttr[Lore](GenIso[Lore,Int])
implicit val luckAttr: IntegralAttr[Luck] = new IntegralAttr[Luck](GenIso[Luck,Int])
implicit val combatAttr: IntegralAttr[Combat] = new IntegralAttr[Combat](GenIso[Combat,Int])
implicit val evasionAttr: IntegralAttr[Evasion] = new IntegralAttr[Evasion](GenIso[Evasion,Int])
val sta1: Stamina = Stamina(4)
val sta2: Stamina = Stamina(6)
val sta3: Stamina = sta1 + sta2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment