Skip to content

Commit

Permalink
Add Mapping.constant
Browse files Browse the repository at this point in the history
  • Loading branch information
taig committed Sep 26, 2023
1 parent bec9d28 commit 41990ca
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package io.taig.enumeration.ext

import cats.{Hash, Inject}
import cats.{Eq, Hash, Inject}
import cats.syntax.all.*

import scala.annotation.targetName
import scala.collection.immutable.IntMap

abstract class Mapping[A, B] extends Inject[A, B]:
Expand All @@ -15,3 +17,12 @@ object Mapping:
val lookup: IntMap[A] = values.map(a => (f(a).hash, a)).to(IntMap)
override def inj: A => B = f
override def prj: B => Option[A] = b => lookup.get(b.hash)

def constant[A <: B: ValueOf, B: Eq]: Mapping[A, B] = new Mapping[A, B]:
val a: A = valueOf[A]
override def values: List[A] = List(a)
override def inj: A => B = identity
override def prj: B => Option[A] = b => Option.when(b === a)(a)

@targetName("constantOf")
def constant[A: Eq](value: A & Singleton): Mapping[value.type, A] = constant[value.type, A]
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,23 @@ final class MappingTest extends FunSuite:
case Cat
case Dog

val injection: Mapping[Animal, String] = Mapping.enumeration:
val mapping: Mapping[Animal, String] = Mapping.enumeration:
case Animal.Bird => "Bird"
case Animal.Cat => "Cat"
case Animal.Dog => "Dog"

assertEquals(obtained = injection.inj(Animal.Bird), expected = "Bird")
assertEquals(obtained = injection.inj(Animal.Cat), expected = "Cat")
assertEquals(obtained = injection.inj(Animal.Dog), expected = "Dog")
assertEquals(obtained = injection.prj("Bird"), expected = Some(Animal.Bird))
assertEquals(obtained = injection.prj("Cat"), expected = Some(Animal.Cat))
assertEquals(obtained = injection.prj("Dog"), expected = Some(Animal.Dog))
assertEquals(obtained = injection.prj("Whale"), expected = None)
assertEquals(obtained = mapping.inj(Animal.Bird), expected = "Bird")
assertEquals(obtained = mapping.inj(Animal.Cat), expected = "Cat")
assertEquals(obtained = mapping.inj(Animal.Dog), expected = "Dog")
assertEquals(obtained = mapping.prj("Bird"), expected = Some(Animal.Bird))
assertEquals(obtained = mapping.prj("Cat"), expected = Some(Animal.Cat))
assertEquals(obtained = mapping.prj("Dog"), expected = Some(Animal.Dog))
assertEquals(obtained = mapping.prj("Whale"), expected = None)

test("enumeration.constant"):
val mapping = Mapping.constant[String]("foobar")

assertEquals(obtained = mapping.inj("foobar"), expected = "foobar")
assertEquals(obtained = mapping.prj("foobar"): Option[String], expected = Some("foobar"))
assertEquals(obtained = mapping.prj("foo"): Option[String], expected = None)
assertEquals(obtained = mapping.prj("bar"): Option[String], expected = None)

0 comments on commit 41990ca

Please sign in to comment.