A collection of bifunctor effect typeclasses, with instances for ZIO and conversions for cats-effect.
bfect-core
- A collection of bifunctor effect typeclasses, based loosely around the structure of cats-effectbfect-testing
- An implementation of a bifunctor state monad along with instances for thebfect-core
typeclassesbfect-interop-cats
- Implicit conversions between thebfect-core
typeclasses and their analogs incats-core
andcats-effect
bfect-interop-fs2
- Utilities for interoperation withfs2
bfect-interop-zio
- Instances of thebfect-core
typeclasses for the ZIO IO monadbfect-io
- A half-finished bifunctor IO monad (don't use this)
Each of these are available through Maven Central, just add them to your project with your favourite build tool.
Typeclass | Cats equivalent | Comment |
---|---|---|
Bifunctor (BFunctor ) |
cats.Functor /cats.Bifunctor |
Functor with biMap and its derivations (map /rightMap , leftMap ) |
BifunctorMonad (BMonad ) |
cats.Monad |
Monad. Adds flatMap , rightPure and leftPure . |
BifunctorMonadError (BME ) |
cats.MonadError |
Represents the ability to handle errors with handleErrorWith . Comes with the alias BME . |
effects.Bracket |
cats.effect.Bracket |
Bracket. Represents the pure equivalent of try /finally |
effects.Now |
cats.effect.Timer |
Represents the ability to create a timestamp |
effects.Timer |
cats.effect.Timer |
Extends Now with the ability to delay execution for a period of time |
effects.Die |
Extends BifunctorMonadError with the ability to suspend an effect that fails in an unchecked manner |
|
effects.Sync |
cats.effect.Sync |
Extends Die with the ability to suspend arbitrary synchronous effects |
effects.Async |
cats.effect.Async |
Extends Sync with the ability to register asynchronous effects |
effects.Concurrent |
cats.effect.Concurrent |
Represents the effect of starting and cancelling tasks |
effects.extra.Console |
Represents the effect of writing to the console | |
effects.extra.EnvVars |
Represents the effect of accessing environment variables | |
effects.extra.Resources |
Represents the effect of accessing Java resources | |
effects.extra.Calendar |
Extends Now with the ability to determine the system timezone, enabling computation of the local date and so on. |
Note that unlike in cats, Bracket
and Concurrent
are not part of the main inheritance chain that includes Sync
and Async
Use the following imports:
import au.id.tmm.bfect.syntax.all._
for extension methodsimport au.id.tmm.bfect.instances.all._
for instancesimport au.id.tmm.bfect.implicits._
for everything
import au.id.tmm.bfect.effects.Sync
import au.id.tmm.bfect.implicits._
// Companion objects provide static methods:
def hello1[F[_, _] : Sync]: F[Nothing, String] = Sync[F].pure("hello")
def hello2[F[_, _] : Sync]: F[Nothing, String] = Sync.pure("hello")
def print1[F[_, _] : Sync](string: String): F[Nothing, Unit] = Sync[F].sync(println(string))
def print2[F[_, _] : Sync](string: String): F[Nothing, Unit] = Sync.sync(println(string))
// Sync.Ops provides instance methods. The following are equivalent:
def printHello1[F[_, _] : Sync]: F[Nothing, Unit] = Sync[F].flatMap(hello1)(print1)
def printHello2[F[_, _] : Sync]: F[Nothing, Unit] = hello1.flatMap(print1)
// Importing Sync.Ops enables for-yield syntax:
def printHello3[F[_, _] : Sync]: F[Nothing, Unit] =
for {
hello <- hello1
_ <- print1(hello)
} yield ()
The bfect-interop-cats
package provides implicits for interoperation with Cats. This includes instances
for effect types using EitherT
. The easiest way to access these is with the following import:
import au.id.tmm.bfect.interop.cats.implicits._