Slide 54
Slide 54 text
Invariant Sequencing of HLists
54
def isequence[F[_], L <: HList, M <: HList](l: L)(implicit
im: InvariantMonoidal[F],
utcc: *->*[F]#?[L],
folder: RightFolder.Aux[L, F[HNil], ISequenceFolder.type, F[M]]
): F[M] = {
l.foldRight(im.pure(HNil: HNil))(ISequenceFolder)
}
object ISequenceFolder extends Poly2 {
implicit def caseInvariantMonoidal[F[_], A, B <: HList](
implicit im: InvariantMonoidal[F]
) = at[F[A], F[B]] { (fa, fb) =>
val zipped: F[(A, B)] = im.zip(fa, fb)
im.xmap(zipped)(ab => ab._1 :: ab._2)(abl => (abl.head, abl.tail))
}
}
Fold over L, starting with an F[HNil], combining each
F[Xi] with an accumulated F[K <: HList]