summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/funcdata/CList.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/funcdata/CList.java')
-rw-r--r--src/main/java/bjc/funcdata/CList.java54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main/java/bjc/funcdata/CList.java b/src/main/java/bjc/funcdata/CList.java
new file mode 100644
index 0000000..b9ee10e
--- /dev/null
+++ b/src/main/java/bjc/funcdata/CList.java
@@ -0,0 +1,54 @@
+package bjc.funcdata;
+
+import java.util.function.UnaryOperator;
+
+import bjc.data.Either;
+import bjc.data.Pair;
+import bjc.functypes.Unit;
+
+public class CList<T> implements CListLike<T> {
+ private Either<Unit, Pair<T, CList<T>>> data;
+
+ private CList() {
+ data = Either.left(Unit.UNIT);
+ }
+
+ private CList(T data, CList<T> 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<T> tail() {
+ return data.forceRight().getRight();
+ }
+
+ @Override
+ public CList<T> prefix(T val) {
+ return new CList<>(val, this);
+ }
+
+ public static <T> UnaryOperator<CList<T>> prefixing(T val) {
+ return (lst) -> lst.prefix(val);
+ }
+
+ public static <T> CList<T> empty() {
+ return new CList<>();
+ }
+ public static <T> CList<T> of(T... vals) {
+ CList<T> ret = empty();
+ for (int i = vals.length - 1; i >= 0; i-- ) {
+ ret = ret.prefix(vals[i]);
+ }
+ return ret;
+ }
+}