adt4j-examples

Artifact to use as universal maven parent

License

License

Categories

Categories

ADT4J Application Layer Libs Code Generators
GroupId

GroupId

com.github.sviperll
ArtifactId

ArtifactId

adt4j-examples
Last Version

Last Version

3.2
Release Date

Release Date

Type

Type

jar
Description

Description

adt4j-examples
Artifact to use as universal maven parent

Download adt4j-examples

How to add to project

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

Dependencies

provided (2)

Group / Artifact Type Version
com.google.code.findbugs : annotations jar 2.0.3
com.github.sviperll : adt4j jar 3.2

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
3.2
3.2-beta2
3.2-beta1
3.2-alpha1
3.1
3.1-beta1
3.0.2
3.0.1
3.0-rc2
3.0-rc1
2.0.2
2.0.1
2.0.1-rc7
2.0.1-rc5
2.0.1-rc4
1.3
1.3-beta1
1.2
1.1
1.0
0.14
0.13
0.12
0.11
0.10
0.8.1
0.8
0.7
0.5
0.4
0.3