In this workshop we will introduce concepts from a range of Typelevel (and Typelevel-adjacent) projects—from Cats to Shapeless to Monocle to fs2—while coming up with practical solutions to JSON processing problems with Circe. If you've heard ever about functors or monads or generic programming or lenses and wondered "but what are these things good for?", this workshop is for you.
We have many improvements and new features in the works for Circe 1.0,
including a more convenient JSON representation, better error messages,
more options when decoding JSON numbers, and—most significantly—a
new approach to decoding
that makes it possible to work with alternative formats (like BSON) or other
libraries' JSON representations, without mapping through io.circe.Json
.
This session will consist of a short overview of some of these changes, followed by time for discussion and feedback from current and potential Circe users.
The 1.0 release of Circe will introduce a new approach to decoding that replaces
cursors with a simple algebra of navigation and reading operations. While this
approach is largely source-compatible with existing decoder definitions, it
opens up a wide range of new possibilities. By decoupling the interpretation of the
decoder from any particular JSON representation, we're now able, for example,
to define (or generically derive) a Decoder
value and then use it to decode an
instance of Circe's Json
AST, or of ScalaJSON's AST, or even to decode a type
representing a BSON or YAML value.
While this new approach will be included in the core Circe module in 1.0, it's available now as a separate dependency. This talk will begin with a high-level overview of the motivations for the change, but the focus will be a hands-on exploration of the capabilities of the new approach.
Travis Brown currently writes Scala for Stripe, maintains several open source Scala libraries (including Circe and iteratee.io), and contributes to many others (for example Finch, Cats, and Shapeless).
(I don't think I have a good photo handy but here's the one I use for Twitter, GitHub, etc.)