package io.trygvis.esper.testing.sql; import java.sql.*; public abstract class SqlOption { public static SqlOption none() { return new None<>(); } public static SqlOption some(A a) { return new Some<>(a); } public static SqlOption fromRs(ResultSet rs) throws SQLException { if (!rs.next()) { return none(); } return some(rs); } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- public abstract SqlOption map(SqlF f) throws SQLException; public SqlOption flatMap(SqlF> f) throws SQLException { SqlOption> 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 extends SqlOption { public SqlOption map(SqlF f) { return none(); } public A get() throws SQLException { throw new SQLException("get() on None"); } public boolean isSome() { return false; } } private static class Some extends SqlOption { private final A a; private Some(A a) { this.a = a; } public SqlOption map(SqlF f) throws SQLException { return some(f.apply(a)); } public A get() { return a; } public boolean isSome() { return true; } } }