RationalIntegerTest.java
package com.acme.math;

import church.lang.ByteStream;
import church.lang.operators.Arithmetic;
import church.lang.operators.Arithmetic.*;
import church.lang.operators.Relational.$$equal;
import church.lang.operators.Streams.$$encode;
import church.math.Fraction;
import church.math.Fraction.$Canonical;
import church.primitives.Integers;
import church.primitives.Objects;

import static church.lang.operators.Streams.output;
import static church.math.Fraction.fraction;

@SuppressWarnings("unchecked")
public class RationalIntegerTest {
    private static final $$neg<Integer>                              $S0  = Integers::$neg;
    private static final $$neg<Fraction<Integer>>                    $S1  = Fraction.$neg($S0);
    private static final $$prd<Integer, Integer>                     $S2  = Integers::$prd;
    private static final $Sign<Integer>                              $S3  = Integers::sign;
    private static final $Gcd<Integer>                               $S4  = Integers::gcd;
    private static final $$dof<Integer>                              $S5  = Integers::$dof;
    private static final $Canonical<Integer>                         $S6  = Fraction.canonical($S2, $S3, $S4, $S5);
    private static final $$sum<Integer>                              $S7  = Integers::$sum;
    private static final $$sum<Fraction<Integer>>                    $S8  = Fraction.$sum($S6, $S7, $S2);
    private static final $$sub<Fraction<Integer>>                    $S9  = Arithmetic.$sub($S8, $S1);
    private static final $$prd<Fraction<Integer>, Fraction<Integer>> $S10 = Fraction.$prd($S6, $S2);
    private static final $$encode<ByteStream, String>                $S11 = Objects::$encode;
    private static final $$equal<Integer>                            $S12 = Integers::$equal;
    private static final $Multiplicative_identity<Integer>           $S13 = Integers::multiplicative_identity;
    private static final $$encode<ByteStream, Integer>               $S14 = Integers::$encode;
    private static final $$encode<ByteStream, Fraction<Integer>>     $S15 = Fraction.$encode($S12, $S13, $S14, $S11);
    private static final $$equal<Fraction<Integer>>                  $S16 = Fraction.$equal($S12);

    public static void main(String[] args) {
        Fraction<Integer> r1 = fraction(1, 2);
        Fraction<Integer> r2 = fraction(3, 4);
        Fraction<Integer> r3 = $S1.$neg(r1);
        Fraction<Integer> r4 = $S9.$sub($S8.$sum(r1, $S10.$prd(r2, r3)), r3);
        $S11.$encode($S15.$encode(output, r4), "\n");
        assert $S16.$equal(r4, fraction(5, 8));
    }

}