diff options
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/util/sql/SqlOption.java')
-rw-r--r-- | src/main/java/io/trygvis/esper/testing/util/sql/SqlOption.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/util/sql/SqlOption.java b/src/main/java/io/trygvis/esper/testing/util/sql/SqlOption.java new file mode 100644 index 0000000..286a872 --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/util/sql/SqlOption.java @@ -0,0 +1,109 @@ +package io.trygvis.esper.testing.util.sql; + +import java.sql.*; + +public abstract class SqlOption<A> { + public static <A> SqlOption<A> none() { + return new None<>(); + } + + public static <A> SqlOption<A> some(A a) { + return new Some<>(a); + } + + public static SqlOption<ResultSet> fromRs(ResultSet rs) throws SQLException { + if (!rs.next()) { + return none(); + } + + return some(rs); + } + + // ----------------------------------------------------------------------- + // + // ----------------------------------------------------------------------- + + public abstract <B> SqlOption<B> map(SqlF<A, B> f) throws SQLException; + + public <B> SqlOption<B> flatMap(SqlF<A, SqlOption<B>> f) throws SQLException { + SqlOption<SqlOption<B>> x = map(f); + + if (x.isNone()) { + return none(); + } + + return x.get(); + } + + public abstract A get() throws SQLException; + + public abstract boolean isSome(); + + public boolean isNone() { + return !isSome(); + } + + public abstract A getOrElse(A a); + + public static <A> SqlOption<A> fromNull(A a) { + if (a != null) { + return some(a); + } else { + return none(); + } + } + + // ----------------------------------------------------------------------- + // + // ----------------------------------------------------------------------- + + private static class None<A> extends SqlOption<A> { + public <B> SqlOption<B> map(SqlF<A, B> f) { + return none(); + } + + public A get() throws SQLException { + throw new SQLException("get() on None"); + } + + public boolean isSome() { + return false; + } + + public A getOrElse(A a) { + return a; + } + + public String toString() { + return "None"; + } + } + + private static class Some<A> extends SqlOption<A> { + private final A a; + + private Some(A a) { + this.a = a; + } + + public <B> SqlOption<B> map(SqlF<A, B> f) throws SQLException { + return some(f.apply(a)); + } + + public A get() { + return a; + } + + public boolean isSome() { + return true; + } + + public A getOrElse(A a) { + return this.a; + } + + public String toString() { + return "Some(" + a + ")"; + } + } +} |