adt4j-core

Sonatype helps open source projects to set up Maven repositories on https://oss.sonatype.org/

License

License

Categories

Categories

ADT4J Application Layer Libs Code Generators
GroupId

GroupId

com.github.sviperll
ArtifactId

ArtifactId

adt4j-core
Last Version

Last Version

0.11
Release Date

Release Date

Type

Type

jar
Description

Description

adt4j-core
Sonatype helps open source projects to set up Maven repositories on https://oss.sonatype.org/

Download adt4j-core

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.sviperll/adt4j-core/ -->
<dependency>
    <groupId>com.github.sviperll</groupId>
    <artifactId>adt4j-core</artifactId>
    <version>0.11</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.sviperll/adt4j-core/
implementation 'com.github.sviperll:adt4j-core:0.11'
// https://jarcasting.com/artifacts/com.github.sviperll/adt4j-core/
implementation ("com.github.sviperll:adt4j-core:0.11")
'com.github.sviperll:adt4j-core:jar:0.11'
<dependency org="com.github.sviperll" name="adt4j-core" rev="0.11">
  <artifact name="adt4j-core" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.sviperll', module='adt4j-core', version='0.11')
)
libraryDependencies += "com.github.sviperll" % "adt4j-core" % "0.11"
[com.github.sviperll/adt4j-core "0.11"]

Dependencies

compile (2)

Group / Artifact Type Version
com.google.code.findbugs : annotations jar 2.0.3
com.helger : jcodemodel jar 2.7.7

test (1)

Group / Artifact Type Version
junit : junit jar 4.11

Project Modules

There are no modules declared in this project.

adt4j - Algebraic Data Types for Java

This library implements Algebraic Data Types for Java.
ADT4J provides annotation processor for @GenerateValueClassForVisitor annotation.
ADT4J generates new class for each @GenerateValueClassForVisitor annotation.

It allows you to easily define custom data types. Like this:

// Define Expression data type
@WrapsGeneratedValueClass(visitor = ExpressionVisitor.class)
// ExpressionBase class will be automatically generated by annotation processor
// You can use any other name instead of ExpressionBase, like VeryLongNameThatYouShouldNeverActuallyUse
class Expression extends ExpressionBase {
  public static void main(String[] args) {
    // Static constructor methods are automatically generated for Expression class
    Expression e = mul(sum(lit(5), lit(1)), lit(2));

    // Reasonable default toString implementation is provided:
    System.out.println(e + " = " + e.eval());
  }

  // This is the required boilerplate for wrapper-class
  Expression(ExpressionBase base) {
    super(base);
  }

  // Example of "pattern-matching"
  int eval() {
    return accept(new ExpressionVisitor<Integer>() {
      Integer lit(int i) {
        return i;
      }
      Integer sum(Expression e1, Expression e2) {
        return e1.eval() + e2.eval();
      }
      Integer mul(Expression e1, Expression e2) {
        return e1.eval() * e2.eval();
      }
    });
  }

  // Actual data-type definition
  // Data type is recursive. No special treatment of recursive definition is required.
  @GenerateValueClassForVisitor(wrapperClass = Expression.class)
  @Visitor(resultVariableName="R")
  interface ExpressionVisitor<R> {
    @GeneratePredicate(name = "isLiteral");
    R lit(int i);

    R sum(@Getter(name = "leftOperand") Expression e1, @Getter(name = "rightOperand") Expression e2);
    R mul(@Getter(name = "leftOperand") Expression e1, @Getter(name = "rightOperand") Expression e2);
  }

}

Features

  • Support recursive data types
  • Generate hashCode, equals and toString implementations with value semantics
  • Generate predicates, getters and "updaters" with additional annotations
  • Fully customizable API: custom names and access levels for generated methods
  • Optionally generate Comparable implementation with precise compile-time type-check if it is possible
  • Optionally generate serializable classes with precise compile-time type-check if it is possible
  • Sensible error messages
  • Support generated class extention through standard Java's inheritance.
  • Reasonably fast

Known Issues

License

ADT4J is under BSD 3-clause license.

Flattr

Flattr this git repo

Installation

Use maven dependency to use ADT4J:

<dependency>
  <groupId>com.github.sviperll</groupId>
  <artifactId>adt4j</artifactId>
  <version>3.2</version>
</dependency>

You can use adt4j-shaded artifact to simplify deployment and to avoid dependencies' conflicts. adt4j-shaded has no dependencies and does not pollute classpath. All java-packages provided by adt4j-shaded are rooted at com.github.sviperll.adt4j package.

<dependency>
  <groupId>com.github.sviperll</groupId>
  <artifactId>adt4j-shaded</artifactId>
  <version>3.2</version>
</dependency>

Changelog

See NEWS file.

Usage

See Tutorial

Build

$ git clone [email protected]:sviperll/adt4j.git
$ cd adt4j
$ mvn test

Check for errors and warnings.

ADT4J is built to be compatible with Java 7. See universal-maven-parent project's documentation for instructions about building projects compatible with JDK7.

Versions

Version
0.11
0.10
0.8.1
0.8
0.7
0.5
0.4
0.3