bfect
bfect copied to clipboard
Some bifunctor IO type classes
trafficstars
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-coretypeclassesbfect-interop-cats- Implicit conversions between thebfect-coretypeclasses and their analogs incats-coreandcats-effectbfect-interop-fs2- Utilities for interoperation withfs2bfect-interop-zio- Instances of thebfect-coretypeclasses 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
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 ()
Cats interoperation
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._