Skip to content
This repository has been archived by the owner on Jan 13, 2025. It is now read-only.

Commit

Permalink
Add AreElementsOf
Browse files Browse the repository at this point in the history
  • Loading branch information
afsalthaj committed Jul 19, 2022
1 parent 12ab80d commit f043aaf
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 2 deletions.
36 changes: 36 additions & 0 deletions core/src/main/scala/zio/constraintless/AreElementsOf.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package zio.constraintless

import TypeList.{::, End}

sealed trait AreElementsOf[T1 <: TypeList, T2 <: TypeList]

object AreElementsOf {
def apply[T1 <: TypeList, T2 <: TypeList](implicit
ev: AreElementsOf[T1, T2]
): AreElementsOf[T1, T2] = ev

final case class TypeCollection[T1, T11 <: TypeList, T2 <: TypeList](
ev1: T1 IsElementOf T2,
ev2: T11 AreElementsOf T2
) extends AreElementsOf[T1 :: T11, T2]

final case class NilCollection[T2 <: TypeList]()
extends AreElementsOf[End, T2]

implicit def typesElementsOfTypes[Head, Tail <: TypeList, Types <: TypeList](
implicit
ev1: Head IsElementOf Types,
ev2: Tail AreElementsOf Types
): AreElementsOf[Head :: Tail, Types] =
TypeCollection(ev1, ev2)

implicit def endElementOfTypes[Types <: TypeList]: AreElementsOf[End, Types] =
NilCollection()

}

object Sample extends App {
println(AreElementsOf[Int :: Double :: End, Int :: Double :: End])
println(AreElementsOf[Double :: Int :: End, Int :: Double :: Long :: End])
// println(AreElementsOf[String :: Double :: End, Int :: Double :: End]) // doesn't compiol;e
}
1 change: 0 additions & 1 deletion core/src/main/scala/zio/constraintless/IsElementOf.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import TypeList._

sealed trait IsElementOf[Type, Types <: TypeList]

//
object IsElementOf {
def apply[A, As <: TypeList](implicit
ev: IsElementOf[A, As]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ case class Prod[As <: TypeList, A, B](
b: Expr[As, B],
c1: A IsElementOf As,
c2: B IsElementOf As,
c3: (A, B) IsElementOf As
) extends Expr[As, (A, B)]

case class Cond[As <: TypeList, A](
Expand Down

0 comments on commit f043aaf

Please sign in to comment.