Предоставя:
import cats.syntax.option.*
val maybeOne = 1.some // Some(1): Option[Int]
val maybeN = none[Int] // None: Option[Int]
val either = maybeOne.toRightNec("It's not there :(") // Right(1): Either[String, Int]
val validated = maybeOne.toValidNec("It's not there :(") // Left("..."): Either[String, Int]
val integer = maybeN.orEmpty // 0
implicit
класове за extension методиgiven
инстанции се използват implicit
val
-ове и def
-овеusing
параметри се декларират implicit
параметриgiven
, където се очаква implicit
, и използване на implicit
, където се очаква using
Cats използва изцяло Scala 2 синтаксиса за Type Class-ове (чрез implicit
)
Абстрактни членове:
OptionT
и EitherT
“Framework to build composable typesafe functional concurrency libraries and applications.” – Cats Effect
Разширява MonadError
с опция за канселиране. Така ефектът може да бъде в едно от следните състояния:
trait MonadCancel[F[_], E] extends MonadError[F, E]:
// Gives us a cancelled instance of the effect. Every composition
// with it should cancel all the dependent effects
def canceled: F[Unit]
// Registers an action for when the effect is cancelled
def onCancel[A](fa: F[A], fin: F[Unit]): F[A]
// ... and some other methods
MonadCancel
имплементира следната операция:
Това ни позволява да менажираме ресурси, които трябва да бъдат затваряни.
Генерира гарантирано уникални (при сравнение) стойности
start
compute
pool-аIO[Fiber]
, който може да бъде join
-нат, за да изчакаме резултата му, или cancel
-иран
both
) или в състезание (race
)join
parTupled
и другите Parallel
операции водят до създаване на fiber
-иПозволява безопасна обмяна на информация между fiber-и
Благодарение на него са имплементирани структури като Ref, Queue, Deferred и други
Дава ни текущото време
Позволява ни да sleep
-ваме и да имплементираме timeout
-и.
Използва scheduler thread pool-а на Runtime-а.
Осигурява връзка към външния свят през синхронен API, като отлага неговия страничен ефект:
trait Sync[F[_]] extends MonadCancel[F, Throwable] with Clock[F] with Unique[F] with Defer[F]:
// Синхронният код, който ще бъде отложен и превърнат
// във функционален ефект
def delay[A](thunk: => A): F[A]
// Блокиращ синхронен код – ще се изпълни в blocking thread pool-а
def blocking[A](thunk: => A): F[A]
// Като blocking, но позволяващо канселиране, използващо
// стандартния метод за канселиране на грешки в Java (interrupt)
def interruptible[A](thunk: => A): F[A]
Осигурява връзка към външния свят през асинхронен, callback-базиран API:
trait Async[F[_]] extends AsyncPlatform[F] with Sync[F] with Temporal[F]:
// Позволява на IO да регистрира callback за тази операция
def async_[A](k: (Either[Throwable, A] => Unit) => Unit): F[A]
// По-обща версия, позволяваща и канселиране
def async[A](k: (Either[Throwable, A] => Unit) => F[Option[F[Unit]]]): F[A]
// Дава достъп до compute execution context-а, в който да се изпълни
// асинхронен код
def executionContext: F[ExecutionContext]
// Подменя comput execution context-а
def evalOn[A](fa: F[A], ec: ExecutionContext): F[A]
MonadCancel
– добавя възможност за канселиранеSpawn
– изпълнение на множество конкурентни fiber-аConcurrent
– възможност за описване на безопасен достъп до споделени ресурси (т. нар. Ref) и за изчакване на ресурси (т. нар. Deferred)Clock
– описване на достъп до текущото времеTemporal
– приспиване на fiber за определено времеUnique
– генериране на уникални тоукъниSync
– адаптиране на синхронни изчисления (блокиращи и неблокиращи) към ефектни (и асинхронни) такиваAsync
– адаптиране на callback-базиран асинхронен API към ефектен такъв