@@ -0,0 +1,1719 @@
+package ktak.immutablejava;%0A%0Apublic abstract class Either%3CX,Y%3E %7B%0A    %0A    public abstract %3CR%3E R visit(Visitor%3CR,X,Y%3E visitor);%0A    %0A    public abstract %3CZ%3E Either%3CZ,Y%3E mapLeft(Function%3CX,Z%3E f);%0A    public abstract %3CZ%3E Either%3CX,Z%3E mapRight(Function%3CY,Z%3E f);%0A    %0A    public interface Visitor%3CR,X,Y%3E %7B%0A        public R visitLeft(X x);%0A        public R visitRight(Y y);%0A    %7D%0A    %0A    public static final class Left%3CX,Y%3E extends Either%3CX,Y%3E %7B%0A        %0A        private final X val;%0A        %0A        public Left(X val) %7B this.val = val; %7D%0A        %0A        @Override%0A        public %3CR%3E R visit(Visitor%3CR, X, Y%3E visitor) %7B%0A            return visitor.visitLeft(val);%0A        %7D%0A        %0A        @Override%0A        public %3CZ%3E Either%3CZ, Y%3E mapLeft(Function%3CX, Z%3E f) %7B%0A            return left(f.apply(val));%0A        %7D%0A        %0A        @Override%0A        public %3CZ%3E Either%3CX, Z%3E mapRight(Function%3CY, Z%3E f) %7B%0A            return left(val);%0A        %7D%0A        %0A    %7D%0A    %0A    public static final class Right%3CX,Y%3E extends Either%3CX,Y%3E %7B%0A        %0A        private final Y val;%0A        %0A        public Right(Y val) %7B this.val = val; %7D%0A        %0A        @Override%0A        public %3CR%3E R visit(Visitor%3CR,X,Y%3E visitor) %7B%0A            return visitor.visitRight(val);%0A        %7D%0A        %0A        @Override%0A        public %3CZ%3E Either%3CZ, Y%3E mapLeft(Function%3CX, Z%3E f) %7B%0A            return right(val);%0A        %7D%0A        %0A        @Override%0A        public %3CZ%3E Either%3CX, Z%3E mapRight(Function%3CY, Z%3E f) %7B%0A            return right(f.apply(val));%0A        %7D%0A        %0A    %7D%0A    %0A    public static %3CX,Y%3E Either%3CX,Y%3E left(X x) %7B%0A        return new Left%3CX,Y%3E(x);%0A    %7D%0A    %0A    public static %3CX,Y%3E Either%3CX,Y%3E right(Y y) %7B%0A        return new Right%3CX,Y%3E(y);%0A    %7D%0A    %0A%7D%0A

add Either type