11package asyncstreams
22
33import cats .kernel .Monoid
4- import cats .{Alternative , Monad }
4+ import cats .{Alternative , Applicative , Monad }
55import cats .syntax .applicative ._
66import cats .syntax .flatMap ._
77import cats .syntax .functor ._
@@ -24,7 +24,7 @@ class AsyncStream[F[+_]: Monad, +A](private[asyncstreams] val data: F[Step[A, As
2424 data.map(p => Step (p.value, p.rest.take(n - 1 )))
2525 }
2626
27- def drop (n : Int )( implicit smp : Alternative [ AsyncStream [ F , ? ]]) : AsyncStream [F , A ] =
27+ def drop (n : Int ): AsyncStream [F , A ] =
2828 if (n <= 0 ) this
2929 else AsyncStream {
3030 data.flatMap(p => p.rest.drop(n - 1 ).data)
@@ -82,23 +82,26 @@ class AsyncStream[F[+_]: Monad, +A](private[asyncstreams] val data: F[Step[A, As
8282 stepB <- sb.data
8383 } yield Step ((stepA.value, stepB.value), stepA.rest zip stepB.rest)
8484 }
85+
86+ def zipWithIndex (implicit app : Applicative [AsyncStream [F , ? ]]): AsyncStream [F , (A , Int )] =
87+ zip(AsyncStream .unfold(0 )(_ + 1 ))
8588}
8689
8790object AsyncStream {
8891 private [asyncstreams] def apply [F [+ _]: Monad , A ](data : => F [Step [A , AsyncStream [F , A ]]]): AsyncStream [F , A ] = new AsyncStream (data)
8992 def asyncNil [F [+ _]: Monad , A ](implicit impl : ASImpl [F ]): AsyncStream [F , A ] = impl.empty
9093
91- private [asyncstreams] def generate [F [+ _]: Monad , S , A ](start : S )(gen : S => F [(S , A )])(implicit smp : Alternative [AsyncStream [F , ? ]]): AsyncStream [F , A ] = AsyncStream {
94+ private [asyncstreams] def generate [F [+ _]: Monad , S , A ](start : S )(gen : S => F [(S , A )])(implicit smp : Applicative [AsyncStream [F , ? ]]): AsyncStream [F , A ] = AsyncStream {
9295 gen(start).map((stateEl : (S , A )) => Step (stateEl._2, generate(stateEl._1)(gen)))
9396 }
9497
95- def unfold [F [+ _]: Monad , T ](start : T )(makeNext : T => T )(implicit smp : Alternative [AsyncStream [F , ? ]]): AsyncStream [F , T ] =
98+ def unfold [F [+ _]: Monad , T ](start : T )(makeNext : T => T )(implicit smp : Applicative [AsyncStream [F , ? ]]): AsyncStream [F , T ] =
9699 generate(start)(s => (makeNext(s), s).pure[F ])
97100
98- def unfoldM [F [+ _]: Monad , T ](start : T )(makeNext : T => F [T ])(implicit alt : Alternative [AsyncStream [F , ? ]]): AsyncStream [F , T ] =
101+ def unfoldM [F [+ _]: Monad , T ](start : T )(makeNext : T => F [T ])(implicit alt : Applicative [AsyncStream [F , ? ]]): AsyncStream [F , T ] =
99102 generate(start)(s => makeNext(s).map(n => (n, s)))
100103
101- def unfoldMM [F [+ _]: Monad , T ](start : F [T ])(makeNext : T => F [T ])(implicit alt : Alternative [AsyncStream [F , ? ]]): AsyncStream [F , T ] = AsyncStream {
104+ def unfoldMM [F [+ _]: Monad , T ](start : F [T ])(makeNext : T => F [T ])(implicit alt : Applicative [AsyncStream [F , ? ]]): AsyncStream [F , T ] = AsyncStream {
102105 start.flatMap(initial => generate(initial)(s => makeNext(s).map(n => (n, s))).data)
103106 }
104107}
0 commit comments