Skip to content

Commit

Permalink
Change Mapping.values from List to NonEmptyList
Browse files Browse the repository at this point in the history
  • Loading branch information
taig committed Aug 6, 2024
1 parent ef30f56 commit 00389fb
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package io.taig.enumeration.ext

import cats.Order
import cats.Show
import cats.syntax.all.*
import io.circe.{Codec, Decoder, Encoder}
import cats.kernel.Order

trait circe:
given decodeMapping[A, B](using mapping: Mapping[A, B], decoder: Decoder[B])(using Show[B]): Decoder[A] =
decoder.emap: b =>
mapping
.prj(b)
.toRight(s"Couldn't decode value '$b.' Allowed values: '${mapping.values.map(mapping.inj).mkString(",")}'")
.toRight(
s"Couldn't decode value '$b.' Allowed values: '${mapping.values.map(mapping.inj).map(_.show).mkString_(",")}'"
)

def decoderEnumeration[A, B: Order: Show](
f: A => B
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import cats.kernel.Order

trait ciris:
given conficDecoder[A, B, C: Show](using mapping: Mapping[B, C], decoder: ConfigDecoder[A, C]): ConfigDecoder[A, B] =
ConfigDecoder[A, C].mapOption(typeName = mapping.values.map(mapping.inj).map(_.show).mkString("|"))(mapping.prj)
ConfigDecoder[A, C].mapOption(typeName = mapping.values.map(mapping.inj).map(_.show).mkString_("|"))(mapping.prj)

def decoderEnumeration[A, B, C: Order: Show](
f: B => C
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,26 @@ import cats.data.NonEmptyMap

import scala.annotation.targetName
import cats.Order
import cats.data.NonEmptyList

sealed abstract class Mapping[A, B] extends Inject[A, B]:
def values: List[A]
def values: NonEmptyList[A]

object Mapping:
inline def apply[A, B](using mapping: Mapping[A, B]): Mapping[A, B] = mapping

def enumeration[A, B: Order](f: A => B)(using values: EnumerationValues.Aux[A, A]): Mapping[A, B] = new Mapping[A, B]:
val valuesNel = valuesOf[A]
override val values: NonEmptyList[A] = valuesOf[A]

val lookup: NonEmptyMap[B, A] =
NonEmptyMap.of((f(valuesNel.head), valuesNel.head), valuesNel.tail.map(a => (f(a), a))*)
NonEmptyMap.of((f(values.head), values.head), values.tail.map(a => (f(a), a))*)

override def values: List[A] = valuesNel.toList
override def inj: A => B = f
override def prj: B => Option[A] = lookup.apply

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 values: NonEmptyList[A] = NonEmptyList.one(a)
override def inj: A => B = identity
override def prj: B => Option[A] = b => Option.when(b === a)(a)

Expand Down

0 comments on commit 00389fb

Please sign in to comment.