zio / izumi-reflect

TypeTag without scala-reflect

GitHub

Build

izumi-reflect

@quote: Looks a bit similar to TypeTag

izumi-reflect is a fast, lightweight, portable and efficient alternative for TypeTag from scala-reflect.

izumi-reflect is a lightweight model of Scala type system and provides a simulator of the important parts of the Scala typechecker.

Why izumi-reflect

  1. izumi-reflect compiles faster, runs a lot faster than scala-reflect and is fully immutable and thread-safe,
  2. izumi-reflect supports Scala.js, Scala Native,
  3. izumi-reflect is published for Scala 3, you may check port status here (#22),
  4. izumi-reflect allows you to obtain tags for unapplied type constructors (F[_]) and combine them at runtime.

Credits

izumi-reflect has been created by 7mind to power Izumi Project, as a replacement for TypeTag in reaction to a lack of confirmed information about the future of scala-reflect/TypeTag in Scala 3 (Motivation), and donated to ZIO. This repository contains an independent and more conservative copy of the code comparing to Izumi one.

Izumi

Limitations

izumi-reflect model of the Scala type system is not 100% precise, but "good enough" for the vast majority of the usecases.

Known limitations are:

  1. Type boundaries support is very limited because of a problematic behavior of Scala 2.13 compiler,
  2. Recursive type bounds (F-bounded types) are not preserved and may produce false positives,
  3. Existential types written with forSome are not supported and may produce unexpected results,
  4. Path-Dependent Types are based on variable names and may cause unexpected results with variables with different names but the same type or vice-versa (vs. Scala typechecker)
  5. At the moment Scala 3 port does not support Path-Dependent Types, and Structural Refinements. This will be fixed in future.

Build

build.sbt is generated by sbtgen. During development you may not want to mess with ScalaJS and ScalaNative, you may generate a pure-JVM Scala project:

./sbtgen.sc

Once you finished tinkering with the code you may want to generate full project and test it for all the platforms:

./sbtgen.sc --js --native
sbt +test