Last active
March 5, 2019 11:49
-
-
Save crater2150/0c2a76a791b0d9a790398a9ee19f970b to your computer and use it in GitHub Desktop.
This file contains 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
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