Skip to content

Instantly share code, notes, and snippets.

@benhutchison
Forked from etorreborre/MemberInTransform.scala
Created September 27, 2016 23:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benhutchison/1e782e58bbb60232dc5d67ba98dfe4e5 to your computer and use it in GitHub Desktop.
Save benhutchison/1e782e58bbb60232dc5d67ba98dfe4e5 to your computer and use it in GitHub Desktop.
transform a MemberIn
object Test {
import cats._
import cats.data._
import cats.implicits._
import org.atnos.eff._
import org.atnos.eff.all._
import org.atnos.eff.syntax.all._
case class Address()
case class Person(address: Address)
object Main extends App {
type per[E] = State[Person, ?] |= E
type add[E] = State[Address, ?] |= E
type err[E] = Xor[String, ?] |= E
implicit def AddressPersonNaturalTransformation: (State[Address, ?] ~> State[Person, ?]) =
new (State[Address, ?] ~> State[Person, ?]) {
def apply[X](s: State[Address, X]) =
State[Person, X] { person =>
val (address, x) = s.run(person.address).value
(person.copy(address = address), x)
}
}
def updatePerson[E: per: err]: Eff[E, Unit] = for {
_ <- updateAddress[E](implicitly[per[E]].transform, implicitly[err[E]])
} yield ()
def updateAddress[E: add: err]: Eff[E, Unit] = for {
_ <- get
} yield ()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment