package com.zibaldone.cats
package ch_02

import cats.data.Reader

final case class Configuration(dbUsername: String, dbPassword: String, host: String, port: Int)

final case class DbConnection(username: String, password: String)

object DbConnection:

  val reader: Reader[Configuration, DbConnection] = Reader { conf => DbConnection(conf.dbUsername, conf.dbPassword) }

final case class EmailService(host: String, port: Int, dbConnection: DbConnection)

// reader is a Kleisli so it chains higher-order functions
object EmailService:

  // ex. email service
  val reader: Reader[Configuration, EmailService] =
    for
      conf   <- Reader[Configuration, Configuration](identity)
      dbConn <- DbConnection.reader
    yield EmailService(conf.host, conf.port, dbConn)