From b849aa82c29728e29f879831b68637e10771150d Mon Sep 17 00:00:00 2001 From: Raas Ahsan Date: Sat, 25 Apr 2020 16:04:56 -0500 Subject: [PATCH 1/2] Add Cont alias to ContT --- core/src/main/scala/cats/data/package.scala | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/src/main/scala/cats/data/package.scala b/core/src/main/scala/cats/data/package.scala index 3d5ea2c0ba..2be0e5967e 100644 --- a/core/src/main/scala/cats/data/package.scala +++ b/core/src/main/scala/cats/data/package.scala @@ -82,4 +82,17 @@ 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[Id, A, B] + + object Cont { + def apply[A, B](f: (B => A) => A): Cont[A, B] = + ContT[Id, A, B](f) + + def pure[A, B](b: B): Cont[A, B] = + ContT.pure[Id, A, B](b) + + def defer[A, B](b: => B): Cont[A, B] = + ContT.defer[Id, A, B](b) + } } From dbb6cac3ff6a4697e3cbc990c5ff35e71ddebe93 Mon Sep 17 00:00:00 2001 From: Raas Ahsan Date: Sat, 16 May 2020 01:58:49 -0500 Subject: [PATCH 2/2] Define Cont in terms of Eval --- core/src/main/scala/cats/data/AndThen.scala | 2 +- core/src/main/scala/cats/data/package.scala | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) 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 2be0e5967e..4561800bd8 100644 --- a/core/src/main/scala/cats/data/package.scala +++ b/core/src/main/scala/cats/data/package.scala @@ -83,16 +83,22 @@ package object data extends ScalaVersionSpecificPackage { RepresentableStore[S => *, S, A](f, s) } - type Cont[A, B] = ContT[Id, A, B] + type Cont[A, B] = ContT[Eval, A, B] object Cont { - def apply[A, B](f: (B => A) => A): Cont[A, B] = - ContT[Id, A, B](f) + 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[Id, A, B](b) + ContT.pure[Eval, A, B](b) def defer[A, B](b: => B): Cont[A, B] = - ContT.defer[Id, A, B](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) } }