Skip to content

Instantly share code, notes, and snippets.

@kubukoz
Forked from matfournier/gadthelp.scala
Last active February 6, 2021 01: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 kubukoz/de038ab7eb94c6179a5726ce1b911cf2 to your computer and use it in GitHub Desktop.
Save kubukoz/de038ab7eb94c6179a5726ce1b911cf2 to your computer and use it in GitHub Desktop.
gadthelp
trait AA
trait AA1
trait BB
trait BB1
trait HasScenarios[A, B] {
def scenarios: Map[String, Scenario[A, B]]
}
sealed trait Scenario[A, B]
object Scenario {
// later pattern matching let's me do GADT stuff in pattern matches fine
case object A extends Scenario[AA, AA1]
case object B extends Scenario[BB, BB1]
def from[A, B](s: String)(implicit hasScenarios: HasScenarios[A, B]): Scenario[A, B] = hasScenarios
.scenarios
.getOrElse(s, ??? /* fail the parser here */ )
}
// later usage using the GADT in a pattern match
object Generator {
def from[A, B](scenario: Scenario[A, B]): Box[A, B] = scenario match {
case A => constantA // returns some Box[AA, AA1]
case B => constantB // returns some Box[BB, BB1]
}
}
// later later usage
// relies on the answer of Box[A, B] to lookup implicits for A, B.
// I can use an existential type to parse the string and return Scenario[_,_] later
// but then I lose the fact it's AA, AA1 or BB, BB1 later
// and a bunch of implicit lookups fail because it can't find implicits for
// _$1, and _$2
/*
e.g. I have some
for {
.. some stuff
scenario = Scenario.from(someString) // will be Either[Throwable, Scenario[_, _]].liftTo[IO] or whatever later
generator = Generator.from(scenario)
thing <- doThing(generator)
...
} yield ...
where doThing is
def doThing[A : Codec, B: Codec](box: Box[A, B], ...) {
}
but if I type the initial parsing as a existential type
I get the issue
could not find implicit Codec[Box[_$1,_$2]]]; ensure no imports are missing
but there are definitely codecs that can be derived for Box[AA, AA1] and Box[BB, BB1]
it just is confused as I've lost the typing, even though I should be getting it back
on the pattern match in the gadt to go from Scenario -> Box[A, B]
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment