// Path: sane-dbc-core/src/main/java/com/novarto/sanedbc/core/interpreter/InterpreterUtils.java
// public static <A> DB<A> transactional(DB<A> op)
// {
// 
//     return new DB<A>()
//     {
//         @Override public A run(Connection c) throws SQLException
//         {
//             final boolean wasAutocommit = c.getAutoCommit();
//             Throwable th = null;
//             if (wasAutocommit)
//             {
//                 c.setAutoCommit(false);
//             }
// 
//             try
//             {
//                 A result = op.run(c);
//                 c.commit();
//                 return result;
//             }
//             catch (Throwable e)
//             {
//                 th = e;
//                 c.rollback();
//                 throw e;
// 
//             }
//             finally
//             {
//                 try
//                 {
//                     if (wasAutocommit)
//                     {
//                         c.setAutoCommit(true);
//                     }
//                 }
//                 catch (SQLException e)
//                 {
//                     if (th != null)
//                     {
//                         th.addSuppressed(e);
//                     }
//                     else
//                     {
//                         throw e;
//                     }
//                 }
//             }
// 
//         }
//     };
// }


import fj.P1;
import fj.Try;
import fj.control.db.DB;
import fj.data.Validation;
import fj.function.Try0;
import java.sql.Connection;
import java.sql.SQLException;
import static com.novarto.sanedbc.core.interpreter.InterpreterUtils.transactional;
package com.novarto.sanedbc.core.interpreter;




public class ValidationDbInterpreter
{
    private final Try0<Connection, SQLException> ds;

    public ValidationDbInterpreter(Try0<Connection, SQLException> ds)
    {
        this.ds = ds;
    }


    public <A> P1<Validation<Exception, A>> submit(DB<A> db)
    {
        return Try.<A, Exception>f(() -> {
            try (Connection c = ds.f())
            {
                return db.run(c);
            }
        });

    }

    public <A> P1<Validation<Exception, A>> transact(DB<A> db)
    {

// Path: sane-dbc-core/src/main/java/com/novarto/sanedbc/core/interpreter/InterpreterUtils.java
// public static <A> DB<A> transactional(DB<A> op)
// {
// 
//     return new DB<A>()
//     {
//         @Override public A run(Connection c) throws SQLException
//         {
//             final boolean wasAutocommit = c.getAutoCommit();
//             Throwable th = null;
//             if (wasAutocommit)
//             {
//                 c.setAutoCommit(false);
//             }
// 
//             try
//             {
//                 A result = op.run(c);
//                 c.commit();
//                 return result;
//             }
//             catch (Throwable e)
//             {
//                 th = e;
//                 c.rollback();
//                 throw e;
// 
//             }
//             finally
//             {
//                 try
//                 {
//                     if (wasAutocommit)
//                     {
//                         c.setAutoCommit(true);
//                     }
//                 }
//                 catch (SQLException e)
//                 {
//                     if (th != null)
//                     {
//                         th.addSuppressed(e);
//                     }
//                     else
//                     {
//                         throw e;
//                     }
//                 }
//             }
// 
//         }
//     };
// }


// Path: sane-dbc-core/src/main/java/com/novarto/sanedbc/core/interpreter/ValidationDbInterpreter.java
import fj.P1;
import fj.Try;
import fj.control.db.DB;
import fj.data.Validation;
import fj.function.Try0;
import java.sql.Connection;
import java.sql.SQLException;
import static com.novarto.sanedbc.core.interpreter.InterpreterUtils.transactional;

package com.novarto.sanedbc.core.interpreter;




public class ValidationDbInterpreter
{
    private final Try0<Connection, SQLException> ds;

    public ValidationDbInterpreter(Try0<Connection, SQLException> ds)
    {
        this.ds = ds;
    }


    public <A> P1<Validation<Exception, A>> submit(DB<A> db)
    {
        return Try.<A, Exception>f(() -> {
            try (Connection c = ds.f())
            {
                return db.run(c);
            }
        });

    }

    public <A> P1<Validation<Exception, A>> transact(DB<A> db)
    {

        return submit(transactional(db));