{"id":21948115,"url":"https://github.com/evolution-gaming/akka-effect","last_synced_at":"2025-10-12T08:38:27.988Z","repository":{"id":40257423,"uuid":"176752358","full_name":"evolution-gaming/akka-effect","owner":"evolution-gaming","description":"Cats-Effect \u0026 Akka interop","archived":false,"fork":false,"pushed_at":"2025-10-02T14:30:56.000Z","size":1287,"stargazers_count":56,"open_issues_count":2,"forks_count":7,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-10-02T16:24:38.397Z","etag":null,"topics":["akka","cats","cats-effect","scala"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/evolution-gaming.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-03-20T14:31:04.000Z","updated_at":"2025-10-02T14:55:47.000Z","dependencies_parsed_at":"2023-12-20T15:30:51.105Z","dependency_job_id":"73cbe1cc-8096-4a15-87c7-de9b19d387b4","html_url":"https://github.com/evolution-gaming/akka-effect","commit_stats":null,"previous_names":[],"tags_count":106,"template":false,"template_full_name":null,"purl":"pkg:github/evolution-gaming/akka-effect","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evolution-gaming%2Fakka-effect","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evolution-gaming%2Fakka-effect/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evolution-gaming%2Fakka-effect/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evolution-gaming%2Fakka-effect/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/evolution-gaming","download_url":"https://codeload.github.com/evolution-gaming/akka-effect/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evolution-gaming%2Fakka-effect/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279010793,"owners_count":26084807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["akka","cats","cats-effect","scala"],"created_at":"2024-11-29T05:12:03.729Z","updated_at":"2025-10-12T08:38:27.970Z","avatar_url":"https://github.com/evolution-gaming.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Akka-Effect\n[![Build Status](https://github.com/evolution-gaming/akka-effect/workflows/CI/badge.svg)](https://github.com/evolution-gaming/akka-effect/actions?query=workflow%3ACI) \n[![Coverage Status](https://coveralls.io/repos/evolution-gaming/akka-effect/badge.svg)](https://coveralls.io/r/evolution-gaming/akka-effect)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/42b363aa8ad54f569c4eb62831db5eeb)](https://app.codacy.com/gh/evolution-gaming/akka-effect/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![Version](https://img.shields.io/badge/version-click-blue)](https://evolution.jfrog.io/artifactory/api/search/latestVersion?g=com.evolutiongaming\u0026a=akka-effect-actor_2.13\u0026repos=public)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellowgreen.svg)](https://opensource.org/licenses/MIT)\n\nThis project aims to build a bridge between [akka](https://akka.io) and pure functional code based on [cats-effect](https://typelevel.org/cats-effect)\n\nCovered:\n* [Actors](https://doc.akka.io/docs/akka/current/actors.html)\n* [Persistence](https://doc.akka.io/docs/akka/current/persistence.html)\n\n## Building blocks\n\n\n### `akka-effect-actor` module \n\n#### [Tell.scala](actor/src/main/scala/com/evolutiongaming/akkaeffect/Tell.scala)\n\nRepresents `ActorRef.tell`\n\n```scala\ntrait Tell[F[_], -A] {\n\n  def apply(a: A, sender: Option[ActorRef] = None): F[Unit]\n}\n```\n\n\n#### [Ask.scala](actor/src/main/scala/com/evolutiongaming/akkaeffect/Ask.scala)\n\nRepresents `ActorRef.ask` pattern\n\n```scala\ntrait Ask[F[_], -A, B] {\n\n  def apply(msg: A, timeout: FiniteDuration, sender: Option[ActorRef]): F[B]\n}\n```\n\n\n#### [Reply.scala](actor/src/main/scala/com/evolutiongaming/akkaeffect/Reply.scala)\n\nRepresents reply pattern: `sender() ! reply`\n\n```scala\ntrait Reply[F[_], -A] {\n\n  def apply(msg: A): F[Unit]\n}\n```\n\n\n#### [Receive.scala](actor/src/main/scala/com/evolutiongaming/akkaeffect/Receive.scala)\n\nThis is what you need to implement instead of familiar `new Actor { ... }`  \n\n```scala\ntrait Receive[F[_], -A, B] {\n\n  def apply(msg: A): F[B]\n\n  def timeout:  F[B]\n}\n```\n\n\n#### [ActorOf.scala](actor/src/main/scala/com/evolutiongaming/akkaeffect/ActorOf.scala)\n\nConstructs `Actor.scala` out of `receive: ActorCtx[F] =\u003e Resource[F, Receive[F, Any]]`\n\n\n#### [ActorCtx.scala](actor/src/main/scala/com/evolutiongaming/akkaeffect/ActorCtx.scala)\n\nWraps `ActorContext`\n\n```scala\ntrait ActorCtx[F[_]] {\n\n  def self: ActorRef\n\n  def parent: ActorRef\n\n  def executor: ExecutionContextExecutor\n\n  def setReceiveTimeout(timeout: Duration): F[Unit]\n\n  def child(name: String): F[Option[ActorRef]]\n\n  def children: F[List[ActorRef]]\n\n  def actorRefFactory: ActorRefFactory\n\n  def watch[A](actorRef: ActorRef, msg: A): F[Unit]\n\n  def unwatch(actorRef: ActorRef): F[Unit]\n\n  def stop: F[Unit]\n}\n```\n\n\n### `akka-effect-persistence` module\n\n#### [PersistentActorOf.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/PersistentActorOf.scala)\n\nConstructs `PersistentActor.scala` out of `eventSourcedOf: ActorCtx[F] =\u003e F[EventSourced[F, S, E, C]]`\n\n\n#### [EventSourced.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/EventSourced.scala)\n\nDescribes a lifecycle of entity with regard to event sourcing, phases are: Started, Recovering, Receiving and Termination\n\n```scala\ntrait EventSourced[F[_], S, E, C] {\n\n  def eventSourcedId: EventSourcedId\n\n  def recovery: Recovery\n\n  def pluginIds: PluginIds\n\n  def start: Resource[F, RecoveryStarted[F, S, E, C]]\n}\n```\n\n#### [RecoveryStarted.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/RecoveryStarted.scala)\n\nDescribes start of recovery phase\n \n```scala\ntrait RecoveryStarted[F[_], S, E, C] {\n\n  def apply(\n    seqNr: SeqNr,\n    snapshotOffer: Option[SnapshotOffer[S]]\n  ): Resource[F, Recovering[F, S, E, C]]\n}\n```\n\n\n#### [Recovering.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/Recovering.scala)\n\nDescribes recovery phase\n \n```scala\ntrait Recovering[F[_], S, E, C] {\n\n  def replay: Resource[F, Replay[F, E]]\n\n  def completed(\n    seqNr: SeqNr,\n    journaller: Journaller[F, E],\n    snapshotter: Snapshotter[F, S]\n  ): Resource[F, Receive[F, C]]\n}\n```\n\n\n#### [Replay.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/Replay.scala)\n\nUsed during recovery to replay events\n \n```scala\ntrait Replay[F[_], A] {\n\n  def apply(seqNr: SeqNr, event: A): F[Unit]\n}\n```\n\n\n#### [Journaller.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/Journaller.scala)\n\nDescribes communication with underlying journal\n\n```scala\ntrait Journaller[F[_], -A] {\n\n  def append: Append[F, A]\n\n  def deleteTo: DeleteEventsTo[F]\n}\n```\n\n\n#### [Snapshotter.scala](persistence/src/main/scala/com/evolutiongaming/akkaeffect/persistence/Snapshotter.scala)\n\nDescribes communication with underlying snapshot storage\n\n```scala\n/**\n  * Describes communication with underlying snapshot storage\n  *\n  * @tparam A - snapshot\n  */\ntrait Snapshotter[F[_], -A] {\n\n  def save(seqNr: SeqNr, snapshot: A): F[F[Instant]]\n\n  def delete(seqNr: SeqNr): F[F[Unit]]\n\n  def delete(criteria: SnapshotSelectionCriteria): F[F[Unit]]\n}\n```\n\n\n### `akka-effect-eventsourced` module\n\n#### [Engine.scala](eventsourcing/src/main/scala/com/evolutiongaming/akkaeffect/eventsourcing/Engine.scala)\n\nThis is the main runtime/queue where all actions against your state are processed in desired eventsourcing sequence:\n1. validate and finalize events\n2. append events to journal\n3. publish changed state\n4. execute side effects\n\nIt is optimised for maximum throughput hence different steps of different actions might be executed in parallel as well as events might be stored in batches\n\n```scala\ntrait Engine[F[_], S, E] {\n\n  def state: F[State[S]]\n\n  /**\n    * @return Outer F[_] is about `load` being enqueued, this immediately provides order guarantees\n    *         Inner F[_] is about `load` being completed\n    */\n  def apply[A](load: F[Validate[F, S, E, A]]): F[F[A]]\n}\n```\n\n\n## Setup\n\nin [`build.sbt`](https://www.scala-sbt.org/1.x/docs/Basic-Def.html#What+is+a+build+definition%3F)\n```scala\naddSbtPlugin(\"com.evolution\" % \"sbt-artifactory-plugin\" % \"0.0.2\")\n\nlibraryDependencies += \"com.evolutiongaming\" %% \"akka-effect-actor\" % \"0.2.1\"\n\nlibraryDependencies += \"com.evolutiongaming\" %% \"akka-effect-actor-tests\" % \"0.2.1\"\n\nlibraryDependencies += \"com.evolutiongaming\" %% \"akka-effect-persistence\" % \"0.2.1\"\n\nlibraryDependencies += \"com.evolutiongaming\" %% \"akka-effect-eventsourcing\" % \"0.2.1\"\n\nlibraryDependencies += \"com.evolutiongaming\" %% \"akka-effect-cluster\" % \"0.2.1\"\n\nlibraryDependencies += \"com.evolutiongaming\" %% \"akka-effect-cluster-sharding\" % \"0.2.1\"\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevolution-gaming%2Fakka-effect","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fevolution-gaming%2Fakka-effect","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevolution-gaming%2Fakka-effect/lists"}