diff options
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/sql/SqlOption.java')
-rw-r--r-- | src/main/java/io/trygvis/esper/testing/sql/SqlOption.java | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java b/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java new file mode 100644 index 0000000..058435e --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java @@ -0,0 +1,83 @@ +package io.trygvis.esper.testing.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(); + } + + // ----------------------------------------------------------------------- + // + // ----------------------------------------------------------------------- + + 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; + } + } + + 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; + } + } +} |