|
| 1 | + |
| 2 | +trait FlatMap[F[_]]: |
| 3 | + def flatMap[A, B](fa: F[A])(f: A => F[B]): F[B] = ??? |
| 4 | + def ifM[B](ifTrue: => F[B], ifFalse: => F[B])(implicit F: FlatMap[F]): F[B] = ??? |
| 5 | +trait Monad[F[_]] extends FlatMap[F] |
| 6 | +trait MonadError[F[_], E] extends Monad[F]: |
| 7 | + def raiseError[A](e: E): F[A] |
| 8 | +trait Temporal[F[_]] extends MonadError[F, Throwable] |
| 9 | + |
| 10 | +trait FlatMapOps[F[_], A]: |
| 11 | + def flatMap[B](f: A => F[B]): F[B] = ??? |
| 12 | + def map[B](f: A => B): F[B] = ??? |
| 13 | + def ifM[B](ifTrue: => F[B], ifFalse: => F[B])(implicit F: FlatMap[F]): F[B] = ??? |
| 14 | + |
| 15 | +implicit def toFlatMapOps[F[_], A](target: F[A])(implicit tc: FlatMap[F]): FlatMapOps[F, A] = ??? |
| 16 | + |
| 17 | +abstract class Ref[F[_], A] |
| 18 | +object Ref: |
| 19 | + final class ApplyBuilders[F[_]]: |
| 20 | + def of[A](a: A): F[Ref[F, A]] = ??? |
| 21 | + def apply[F[_]]: ApplyBuilders[F] = ??? |
| 22 | + |
| 23 | +trait DatabaseMetaData[F[_]] |
| 24 | +class DatabaseMetaDataImpl[F[_]]( |
| 25 | + statementClosed: Ref[F, Boolean], |
| 26 | + resultSetClosed: Ref[F, Boolean] |
| 27 | + ) extends DatabaseMetaData[F] |
| 28 | + |
| 29 | +trait LdbcConnection[F[_]]: |
| 30 | + def getMetaData(): F[DatabaseMetaData[F]] |
| 31 | + |
| 32 | +class ConnectionImpl[F[_]: Temporal](using ev: MonadError[F, Throwable]) |
| 33 | + extends LdbcConnection[F]: |
| 34 | + def isClosed(): F[Boolean] = ??? |
| 35 | + override def getMetaData(): F[DatabaseMetaData[F]] = |
| 36 | + isClosed().ifM( |
| 37 | + ev.raiseError(???), |
| 38 | + (for |
| 39 | + statementClosed <- Ref[F].of[Boolean](false) |
| 40 | + resultSetClosed <- Ref[F].of[Boolean](false) |
| 41 | + yield DatabaseMetaDataImpl[F]( |
| 42 | + statementClosed, |
| 43 | + resultSetClosed |
| 44 | + )) |
| 45 | + ) |
0 commit comments