{
+
+ /** {@inheritDoc} */
+ @Override
+ public Option map(final Function super A, ? extends B> mapper) {
+ Objects.requireNonNull(mapper, "mapper");
+ return Option.none();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public B fold(
+ final Supplier extends B> onNone,
+ final Function super A, ? extends B> onSome) {
+ Objects.requireNonNull(onNone, "onNone");
+ Objects.requireNonNull(onSome, "onSome");
+ return onNone.get();
+ }
+}
diff --git a/src/main/java/io/codeswarm/typeclasses/data/Option.java b/src/main/java/io/codeswarm/typeclasses/data/Option.java
new file mode 100644
index 0000000..f4d24b9
--- /dev/null
+++ b/src/main/java/io/codeswarm/typeclasses/data/Option.java
@@ -0,0 +1,97 @@
+package io.codeswarm.typeclasses.data;
+
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * Represents an optional value without using {@code null} as part of the public API.
+ *
+ * {@code Option} is a sealed algebraic data type with exactly two variants:
+ * {@link Some}, containing a value, and {@link None}, representing absence.
+ *
+ * @param