cats.mtl
MonadLayerControl is possible to use to access lower monad layers in invariant position, as in so-called "control operations".
Three external laws:
def layerMapRespectsLayerControl[A](m: M[A], f: Inner ~> Inner) = { layerMapK(m)(f) <-> layerControl(run => f(run(m)).flatMap(restore) } def distributionLaw[A](nt: State ~> State, st: State[A]) = { restore(nt(st)) <-> layerControl[State[A]](_ (restore(st)).map(nt(_))).flatMap(restore) } def layerControlIdentity[A](ma: M[A]) = { ma <-> layerControl[Inner[State[A]]] { cps => cps(ma).pure[Inner] }.flatMap(layer).flatMap(restore) }
MonadLayerControl is possible to use to access lower monad layers in invariant position, as in so-called "control operations".
Three external laws: