Skip to content

Instantly share code, notes, and snippets.

@djspiewak
Created October 15, 2019 23:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save djspiewak/22f8a8b0c86df9abc8af79fdd6da7cb5 to your computer and use it in GitHub Desktop.
Save djspiewak/22f8a8b0c86df9abc8af79fdd6da7cb5 to your computer and use it in GitHub Desktop.
/*
* Copyright 2014–2019 SlamData Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package quasar.api.destination
import cats.{Eq, Show}
import cats.data.NonEmptyList
import cats.implicits._
import quasar.api.table.ColumnType
import shims._
import scala.{List, Nothing, Option, Product, Serializable, StringContext}
import scala.util.Either
sealed trait TypeCoercion[+C, +T] extends Product with Serializable
object TypeCoercion {
implicit def equal[C: Eq, T: Eq]: Eq[TypeCoercion[C, T]] =
Eq instance {
case (Unsatisfied(a1, t1), Unsatisfied(a2, t2)) =>
a1 === a2 && t1 === t2
case (Satisfied(p1), Satisfied(p2)) =>
p1 === p2
case _ =>
false
}
implicit def show[C: Show, T: Show]: Show[TypeCoercion[C, T]] =
Show show {
case Unsatisfied(alt, top) =>
s"Unsatisfied(${alt.show}, ${top.show})"
case Satisfied(priority) =>
s"Unsatisfied(${priority.show})"
}
final case class Unsatisfied[T](alternatives: List[ColumnType], top: Option[T]) extends TypeCoercion[Nothing, T]
final case class Satisfied[C, T](priority: NonEmptyList[Either[C, T]]) extends TypeCoercion[C, T]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment