import cats._
import cats.syntax.all._
import effectie.monix.Effectful._
import effectie.monix._
import effectie.monix.OptionTSupport._
trait Something[F[_]] {
def foo(a: Int): F[Option[Int]]
def bar(a: Option[Int]): F[Option[Int]]
}
object Something {
def apply[F[_]: Something]: Something[F] =
implicitly[Something[F]]
implicit def something[F[_]: Fx: Monad]: Something[F] =
new SomethingF[F]
final class SomethingF[F[_]: Fx: Monad]
extends Something[F] {
def foo(a: Int): F[Option[Int]] = (for {
x <- a.someTF[F]
y <- (x + 10).someTF[F]
z <- effectOf(y + 100).someT
} yield z).value
def bar(a: Option[Int]): F[Option[Int]] = (for {
x <- a.optionT[F]
y <- effectOf((x + 999).some).optionT
} yield y).value
}
}
import monix.eval._
import monix.execution.Scheduler.Implicits.global
Something[Task].foo(1).runSyncUnsafe()
Something[Task].foo(10).runSyncUnsafe()
Something[Task].bar(1.some).runSyncUnsafe()
Something[Task].bar(none[Int]).runSyncUnsafe()