NestedLiterals.java
package com.acme.collections;

import church.lang.Array;
import church.lang.Array.$WriteElementsToStream;
import church.lang.Array.$WriteEmbracedElementsToStream;
import church.lang.ByteStream;
import church.lang.Hash.$HashCode;
import church.lang.operators.Relational.$$equal;
import church.lang.operators.Streams.$$encode;
import church.math.Vector;
import church.primitives.Integers;
import church.primitives.Objects;
import church.util.HashSet;
import church.util.HashSet.$Set;

import static church.lang.Array.array;
import static church.lang.operators.Streams.output;
import static church.math.Vector.vector;

@SuppressWarnings("unchecked")
public class NestedLiterals {
    private static final $$encode<ByteStream, String>                                                 $S0  = Objects::$encode;
    private static final $$encode<ByteStream, Integer>                                                $S1  = Integers::$encode;
    private static final $WriteElementsToStream<ByteStream, Integer>                                  $S2  = Array.writeElementsToStream($S1, $S0);
    private static final $WriteEmbracedElementsToStream<ByteStream, Integer, String, String>          $S3  = Array.writeEmbracedElementsToStream($S0, $S2, $S0);
    private static final $$encode<ByteStream, Integer[]>                                              $S4  = Array.$encode($S3);
    private static final $WriteElementsToStream<ByteStream, Integer[]>                                $S5  = Array.writeElementsToStream($S4, $S0);
    private static final $WriteEmbracedElementsToStream<ByteStream, Integer[], String, String>        $S6  = Array.writeEmbracedElementsToStream($S0, $S5, $S0);
    private static final $$encode<ByteStream, Integer[][]>                                            $S7  = Array.$encode($S6);
    private static final $$encode<ByteStream, Vector<Integer[]>>                                      $S8  = Vector.$encode($S6);
    private static final $$encode<ByteStream, Vector<Integer>>                                        $S9  = Vector.$encode($S3);
    private static final $WriteElementsToStream<ByteStream, Vector<Integer>>                          $S10 = Array.writeElementsToStream($S9, $S0);
    private static final $WriteEmbracedElementsToStream<ByteStream, Vector<Integer>, String, String>  $S11 = Array.writeEmbracedElementsToStream($S0, $S10, $S0);
    private static final $$encode<ByteStream, Vector<Integer>[]>                                      $S12 = Array.$encode($S11);
    private static final $$equal<Integer>                                                             $S13 = Integers::$equal;
    private static final $HashCode<Integer>                                                           $S14 = Integers::hashCode;
    private static final $Set<Integer>                                                                $S15 = HashSet.set($S13, $S14);
    private static final $$encode<ByteStream, HashSet<Integer>>                                       $S16 = HashSet.$encode($S1);
    private static final $WriteElementsToStream<ByteStream, HashSet<Integer>>                         $S17 = Array.writeElementsToStream($S16, $S0);
    private static final $WriteEmbracedElementsToStream<ByteStream, HashSet<Integer>, String, String> $S18 = Array.writeEmbracedElementsToStream($S0, $S17, $S0);
    private static final $$encode<ByteStream, HashSet<Integer>[]>                                     $S19 = Array.$encode($S18);
    private static final $$equal<Integer[]>                                                           $S20 = Array.$equal($S13);
    private static final $HashCode<Integer[]>                                                         $S21 = Array.hashCode($S14);
    private static final $Set<Integer[]>                                                              $S22 = HashSet.set($S20, $S21);
    private static final $$encode<ByteStream, HashSet<Integer[]>>                                     $S23 = HashSet.$encode($S4);

    public static void main(String[] args) {
        Integer[][] a0 = array(array(1, 2), array(3, 4));
        $S0.$encode($S7.$encode(output, a0), "\n");
        Vector<Integer[]> v1 = vector(array(1, 2), array(3, 4));
        $S0.$encode($S8.$encode(output, v1), "\n");
        Vector<Integer>[] a1 = array(vector(1, 2), vector(3, 4));
        $S0.$encode($S12.$encode(output, a1), "\n");
        HashSet<Integer>[] a2 = array($S15.set(1, 2), $S15.set(3, 4));
        $S0.$encode($S19.$encode(output, a2), "\n");
        HashSet<Integer[]> s1 = $S22.set(array(1, 2), array(3, 4));
        $S0.$encode($S23.$encode(output, s1), "\n");
    }

}