Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

spartanz/schemaz

A purely-functional library for defining type-safe schemas for algebraic data types, providing free generators, SQL queries, JSON codecs, binary codecs, and migration from this schema definition

spartanz/schemaz.json
{
"createdAt": "2018-07-08T05:49:57Z",
"defaultBranch": "prototyping",
"description": "A purely-functional library for defining type-safe schemas for algebraic data types, providing free generators, SQL queries, JSON codecs, binary codecs, and migration from this schema definition",
"fullName": "spartanz/schemaz",
"homepage": "https://spartanz.github.io/schemaz",
"language": "Scala",
"name": "schemaz",
"pushedAt": "2020-01-28T10:36:26Z",
"stargazersCount": 164,
"topics": [],
"updatedAt": "2025-10-12T16:30:33Z",
"url": "https://github.com/spartanz/schemaz"
}

Gitter

[![Build Status][build-image]][build-url] [![Coverage Status][coverage-image]][coverage-url]

[build-image] !: http://img.shields.io/travis/spartanz/schemaz/prototyping.svg [build-url] !: https://travis-ci.org/spartanz/schemaz

[coverage-image] !: https://img.shields.io/codecov/c/github/spartanz/schemaz/prototyping.svg [coverage-url] !: https://codecov.io/github/spartanz/schemaz?branch=prototyping

A purely-functional library for defining type-safe schemas for algebraic data types, providing free generators, SQL queries, JSON codecs, binary codecs, and migration from this schema definition.

SchemaZ defines a generic representation of algebraic data structures and combinators that turn such schema into a generic computation over arbitrary data. In other words, SchemaZ provides a way to express any computation that abstracts over the structure of data, such as:

  • Codecs: given a serial format (binary, JSON, etc.) and the schema of a data structure (say, an ADT) we can derive a codec for that data structure and serial format.
  • Data Generators: given any schema we can derive random data generators (eg. scalacheck’s Gen) that produce data satisfying that schema.
  • Schema/Data Migrations: since schemas are values, we can easily verify whether two versions of a schema are forward/backward compatible and provide a generic way to upgrade/downgrade data from one version of the schema to the other.
  • Diffing/Patching: given a schema we can generically compute the difference between two pieces of data satisfying that schema. In the same spirit, we have generic way to apply patches to arbitrary data structures.
  • Queries: knowing a schema, we can produce SQL queries to interact with a database that holds an instance of (the SQL version of) that schema.
codecsgeneratorsmigrationsdiff/patchqueries
xenomorph?𐄂𐄂
shapeless *𐄂𐄂

*: shapeless provides only the way to abstract over the structure of data, but several libraries build upon shapeless to provide the feature listed in the table.

Skeumorph is also a possible competitor, however it is focused on providing translation between different formats (Avro, Protobuf and Mu). This is achieved by using a central Schema Representation which can losslessly translate to each of the previously mentioned formats.

SchemaZ shares ideas with @nuttycom’s xenomorph library. The talk below presents its design.

Describing Data...with free applicative functors (and more)—Kris Nuttycombe

An Haskell port of the ideas of xenomorph has also been implemented: haskell-schema.