aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/scala
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/scala')
-rw-r--r--core/src/main/scala/com/codiff/fairstream/Fair.scala13
1 files changed, 9 insertions, 4 deletions
diff --git a/core/src/main/scala/com/codiff/fairstream/Fair.scala b/core/src/main/scala/com/codiff/fairstream/Fair.scala
index 72a9ebe..a665c72 100644
--- a/core/src/main/scala/com/codiff/fairstream/Fair.scala
+++ b/core/src/main/scala/com/codiff/fairstream/Fair.scala
@@ -1,6 +1,6 @@
package com.codiff.fairstream
-import cats.{Alternative, Monad, StackSafeMonad}
+import cats.{Alternative, Monad}
sealed trait Fair[+A]
@@ -68,9 +68,8 @@ object Fair {
}
}
- implicit val fairMonad
- : Monad[Fair] with Alternative[Fair] with StackSafeMonad[Fair] =
- new Monad[Fair] with Alternative[Fair] with StackSafeMonad[Fair] {
+ implicit val fairMonad: Monad[Fair] with Alternative[Fair] =
+ new Monad[Fair] with Alternative[Fair] {
def empty[A]: Fair[A] = Fair.empty
def pure[A](a: A): Fair[A] = Fair.unit(a)
@@ -84,6 +83,12 @@ object Fair {
Incomplete(flatMap(i.step)(f))
}
+ def tailRecM[A, B](a: A)(f: A => Fair[Either[A, B]]): Fair[B] =
+ flatMap(f(a)) {
+ case Right(b) => pure(b)
+ case Left(nextA) => Incomplete(tailRecM(nextA)(f))
+ }
+
def combineK[A](x: Fair[A], y: Fair[A]): Fair[A] = mplus(x, y)
}