Last active
July 22, 2020 07:14
-
-
Save afsalthaj/b4161742e75383fcb93a388476a5ff96 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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