package bjc.funcdata; import java.util.function.UnaryOperator; import bjc.data.Either; import bjc.data.Pair; import bjc.functypes.Unit; public class CList implements CListLike { private Either>> data; private CList() { data = Either.left(Unit.UNIT); } private CList(T data, CList rest) { this.data = Either.right(Pair.pair(data, rest)); } @Override public boolean isEmpty() { return data.isLeft(); } @Override public T head() { return data.forceRight().getLeft(); } @Override public CList tail() { return data.forceRight().getRight(); } @Override public CList prefix(T val) { return new CList<>(val, this); } public static UnaryOperator> prefixing(T val) { return (lst) -> lst.prefix(val); } public static CList empty() { return new CList<>(); } public static CList of(T... vals) { CList ret = empty(); for (int i = vals.length - 1; i >= 0; i-- ) { ret = ret.prefix(vals[i]); } return ret; } }