Bfect
A collection of bifunctor effect typeclasses, with instances for ZIO and conversions for cats-effect.
Project structure
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.
Typeclasses
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
Usage
Most typeclasses come with an Ops
implicit class on the companion object. Generally if you are using a typeclass you will import it and the Ops
like so:
import au.id.tmm.bfect.effects.Sync
import au.id.tmm.bfect.effects.Sync.Ops
// 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 ()