ModularTest.java
package com.acme.math;

import church.lang.Array;
import church.lang.Array.$CreateArray;
import church.lang.ByteStream;
import church.lang.JavaClasses.$Java_class;
import church.lang.operators.Arithmetic.*;
import church.lang.operators.Relational;
import church.lang.operators.Relational.$$equal;
import church.lang.operators.Relational.$$neq;
import church.lang.operators.Streams.$$encode;
import church.primitives.Integers;
import church.primitives.Objects;
import com.acme.math.Modular.$Canonical;
import com.acme.math.Modular.$ExtendedEuclid;

import static church.lang.operators.Streams.output;
import static com.acme.math.Modular.modular;

@SuppressWarnings("unchecked")
public class ModularTest {
    private static final $$equal<Integer>                          $S0  = Integers::$equal;
    private static final $$neq<Integer>                            $S1  = Relational.$neq($S0);
    private static final $$rem<Integer>                            $S2  = Integers::$rem;
    private static final $Canonical<Integer>                       $S3  = Modular.canonical($S1, $S2);
    private static final $$prd<Integer, Integer>                   $S4  = Integers::$prd;
    private static final $$prd<Modular<Integer>, Modular<Integer>> $S5  = Modular.$prd($S3, $S4);
    private static final $$encode<ByteStream, String>              $S6  = Objects::$encode;
    private static final $$encode<ByteStream, Integer>             $S7  = Integers::$encode;
    private static final $$encode<ByteStream, Modular<Integer>>    $S8  = Modular.$encode($S6, $S7);
    private static final $$equal<Modular<Integer>>                 $S9  = Modular.$equal($S0);
    private static final $Multiplicative_identity<Integer>         $S10 = Integers::multiplicative_identity;
    private static final $Additive_identity<Integer>               $S11 = Integers::additive_identity;
    private static final $Quotient<Integer>                        $S12 = Integers::quotient;
    private static final $Java_class<Integer>                      $S13 = () -> Integer.class;
    private static final $CreateArray<Integer>                     $S14 = Array.createArray($S13);
    private static final $$sub<Integer>                            $S15 = Integers::$sub;
    private static final $ExtendedEuclid<Integer>                  $S16 = Modular.extendedEuclid($S0, $S11, $S12, $S14, $S15, $S4);
    private static final $$rcp<Modular<Integer>>                   $S17 = Modular.$rcp($S10, $S11, $S16, $S1);

    public static void main(String[] args) {
        Modular<Integer> m1 = modular(10, 2);
        Modular<Integer> m2 = modular(10, 7);
        Modular<Integer> m3 = $S5.$prd(m1, m2);
        $S6.$encode($S8.$encode(output, m3), "\n");
        assert $S9.$equal(m3, modular(10, 4));
        Modular<Integer> m4 = $S17.$rcp(m2);
        $S6.$encode($S8.$encode(output, m4), "\n");
        assert $S9.$equal(m4, modular(10, 3));
    }

}