SetExample.java
package com.acme.sets;

import church.lang.ByteStream;
import church.lang.Collections.$Size;
import church.lang.Hash.$HashCode;
import church.lang.operators.Relational.$$equal;
import church.lang.operators.Streams.$$encode;
import church.primitives.Integers;
import church.primitives.Objects;
import church.util.HashSet;
import church.util.HashSet.$Set;

import static church.lang.operators.Streams.output;
import static church.util.HashSet.contains;

@SuppressWarnings("unchecked")
public class SetExample {
    private static final $$equal<Integer>                       $S0  = Integers::$equal;
    private static final $HashCode<Integer>                     $S1  = Integers::hashCode;
    private static final $Set<Integer>                          $S2  = HashSet.set($S0, $S1);
    private static final $$encode<ByteStream, String>           $S3  = Objects::$encode;
    private static final $$encode<ByteStream, Integer>          $S4  = Integers::$encode;
    private static final $$encode<ByteStream, HashSet<Integer>> $S5  = HashSet.$encode($S4);
    private static final $Size<HashSet<Integer>>                $S6  = HashSet::size;
    private static final $$equal<String>                        $S7  = Objects::$equal;
    private static final $HashCode<String>                      $S8  = Objects::hashCode;
    private static final $Set<String>                           $S9  = HashSet.set($S7, $S8);
    private static final $Size<HashSet<String>>                 $S10 = HashSet::size;
    private static final $$encode<ByteStream, HashSet<String>>  $S11 = HashSet.$encode($S3);

    public static void main(String[] args) {
        HashSet<Integer> a = $S2.set(1, 2, 3, 2, 1);
        $S3.$encode($S5.$encode(output, a), "\n");
        assert $S6.size(a) == 3;
        assert contains(a, 1);
        HashSet<String> b = $S9.set("foo", "bar", "baz", "basil", "basel");
        assert $S10.size(b) == 5;
        $S3.$encode($S11.$encode(output, b), "\n");
    }

}