Skip to content

Instantly share code, notes, and snippets.

@matfournier
Last active February 6, 2021 01:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save matfournier/8b943bddcd6a1552f5c6821aa81abd78 to your computer and use it in GitHub Desktop.
Save matfournier/8b943bddcd6a1552f5c6821aa81abd78 to your computer and use it in GitHub Desktop.
gadthelp
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]
// but how to get into this domain from the outside is the problem...(this doesn't compile obviously)
def from[A, B](s: String): Scenario[A, B] = s match {
case "a" => A
case "b" => B
}
}
// 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