package io.trygvis.esper.testing.util.sql; import fj.data.*; 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(); } public abstract A getOrElse(A a); public abstract A getOrElse(SqlP0 p) throws SQLException; public abstract Option toFj(); public static SqlOption fromNull(A a) { if (a != null) { return some(a); } else { return none(); } } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- 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; } public A getOrElse(A a) { return a; } public A getOrElse(SqlP0 p) throws SQLException { return p.apply(); } public Option toFj() { return Option.none(); } public String toString() { return "None"; } } 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; } public A getOrElse(A a) { return this.a; } public A getOrElse(SqlP0 p) throws SQLException { return a; } public Option toFj() { return Option.some(a); } public String toString() { return "Some(" + a + ")"; } } }