Skip to content

Instantly share code, notes, and snippets.

@lu4nm3
Last active May 14, 2020 02:06
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 lu4nm3/a65ff577704074b402ebb9a3861ac789 to your computer and use it in GitHub Desktop.
Save lu4nm3/a65ff577704074b402ebb9a3861ac789 to your computer and use it in GitHub Desktop.
final class IndexedReaderWriterStateT[F[_], E, L, SA, SB, A](val runF: F[(E, SA) => F[(L, SB, A)]]) {
def map[B](f: A => B)(implicit F: Functor[F]): IndexedReaderWriterStateT[F, E, L, SA, SB, B] = {
transform { (l, s, a) => (l, s, f(a)) }
}
def transform[LL, SC, B](f: (L, SB, A) => (LL, SC, B))
(implicit F: Functor[F]): IndexedReaderWriterStateT[F, E, LL, SA, SC, B] = {
IndexedReaderWriterStateT.applyF {
F.map(runF) { rwsfa =>
(e: E, s: SA) => F.map(rwsfa(e, s)) { case (l, sb, a) =>
val (ll, sc, b) = f(l, sb, a)
(ll, sc, b)
}
}
}
}
def flatMap[SC, B](f: A => IndexedReaderWriterStateT[F, E, L, SB, SC, B])
(implicit F: FlatMap[F], L: Semigroup[L]): IndexedReaderWriterStateT[F, E, L, SA, SC, B] = {
IndexedReaderWriterStateT.applyF {
F.map(runF) { rwsfa =>
(e: E, sa: SA) =>
F.flatMap(rwsfa(e, sa)) { case (la, sb, a) =>
F.flatMap(f(a).runF) { rwsfb =>
F.map(rwsfb(e, sb)) { case (lb, sc, b) =>
(L.combine(la, lb), sc, b)
}
}
}
}
}
}
...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment