Skip to content

Instantly share code, notes, and snippets.

@afsalthaj
Last active July 22, 2020 07:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save afsalthaj/b4161742e75383fcb93a388476a5ff96 to your computer and use it in GitHub Desktop.
Save afsalthaj/b4161742e75383fcb93a388476a5ff96 to your computer and use it in GitHub Desktop.
import zio.{Task, ZIO }
trait ConfigModule {
def configService: ConfigService
}
trait ConfigService {
def config: Task[String]
}
trait MetricsModule {
def metrisService: MetricsService
}
trait MetricsService {
def metrics: ZIO[ConfigService, Throwable, MicroMeter]
}
case class MicroMeter(s: String) {
def runMetrics(int: Int): Int = 1
}
trait RepositoryModule {
def getRepositoryService: RepositoryService
}
trait RepositoryService {
def repo: Task[Repo]
}
class Repo() {
def insert(a: Int): Unit = "inserted"
}
object Run {
val configModule = new ConfigModule {
override def configService: ConfigService = new ConfigService {
override def config: Task[String] = ZIO.succeed("this is a config")
}
}
val metricsService = new MetricsModule {
override def metrisService: MetricsService = new MetricsService {
override def metrics: ZIO[ConfigService, Throwable, MicroMeter] =
ZIO.accessM(config => config.config.map(s => MicroMeter(s)))
}
}
val repositoryModule = new RepositoryModule {
override def getRepositoryService: RepositoryService = new RepositoryService {
override def repo: Task[Repo] = ZIO.succeed(new Repo)
}
}
type Environment = ConfigModule with MetricsModule with RepositoryModule
type App = ZIO[Environment, Throwable, ?]
def mainApp: ZIO[RepositoryService with MetricsService with ConfigService, Throwable, Unit] =
for {
integer <- ZIO.accessM[MetricsService with ConfigService](_.metrics.map(_.runMetrics(1)))
_ <- ZIO.accessM[RepositoryService](_.repo.map(_.insert(integer)))
} yield ()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment