diff --git a/core/src/main/scala/cats/data/AndThen.scala b/core/src/main/scala/cats/data/AndThen.scala index 3987204147..e50fc1e1a8 100644 --- a/core/src/main/scala/cats/data/AndThen.scala +++ b/core/src/main/scala/cats/data/AndThen.scala @@ -12,7 +12,7 @@ import cats.arrow.{ArrowChoice, CommutativeArrow} * Example: * * {{{ - * val seed = AndThen((x: Int) => x + 1)) + * val seed = AndThen((x: Int) => x + 1) * val f = (0 until 10000).foldLeft(seed)((acc, _) => acc.andThen(_ + 1)) * * // This should not trigger stack overflow ;-) diff --git a/core/src/main/scala/cats/data/package.scala b/core/src/main/scala/cats/data/package.scala index 3d5ea2c0ba..4561800bd8 100644 --- a/core/src/main/scala/cats/data/package.scala +++ b/core/src/main/scala/cats/data/package.scala @@ -82,4 +82,23 @@ package object data extends ScalaVersionSpecificPackage { def apply[S, A](f: S => A, s: S): Store[S, A] = RepresentableStore[S => *, S, A](f, s) } + + type Cont[A, B] = ContT[Eval, A, B] + + object Cont { + def apply[A, B](f: (B => Eval[A]) => Eval[A]): Cont[A, B] = + ContT[Eval, A, B](f) + + def pure[A, B](b: B): Cont[A, B] = + ContT.pure[Eval, A, B](b) + + def defer[A, B](b: => B): Cont[A, B] = + ContT.defer[Eval, A, B](b) + + def later[A, B](fn: => (B => Eval[A]) => Eval[A]): Cont[A, B] = + ContT.later(fn) + + def tailRecM[A, B, C](a: A)(f: A => Cont[C, Either[A, B]]): Cont[C, B] = + ContT.tailRecM(a)(f) + } }