1
1
package io .sqooba .oss .timeseries
2
2
3
- import zio .IO
4
- import zio .stream .ZStream .Pull
5
- import zio .stream .{Stream , Take }
6
3
7
4
object StreamMerger {
8
5
@@ -15,47 +12,48 @@ object StreamMerger {
15
12
* @param rightStream ordered
16
13
* @return stream that contains all elements of left and right in the correct order
17
14
*/
18
- private [timeseries] def mergeOrderedSeqs [E , A ](
19
- leftStream : Stream [E , A ],
20
- rightStream : Stream [E , A ]
21
- )(implicit o : Ordering [A ]): Stream [E , A ] = {
22
- import o ._
23
-
24
- def loop (
25
- leftTake : Option [Take [E , A ]],
26
- rightTake : Option [Take [E , A ]],
27
- leftPull : Pull [Any , E , A ],
28
- rightPull : Pull [Any , E , A ]
29
- ): IO [E , ((Option [Take [E , A ]], Option [Take [E , A ]]), Take [E , A ])] = (leftTake, rightTake) match {
30
- // both stopped so we stop
31
- case (Some (Take .End ), Some (Take .End )) => IO .succeed((leftTake, rightTake), Take .End )
32
-
33
- // errors get forwarded
34
- case (Some (Take .Fail (e)), _) => IO .succeed((None , None ), Take .Fail (e))
35
- case (_, Some (Take .Fail (e))) => IO .succeed((None , None ), Take .Fail (e))
36
-
37
- // If one side is empty, we evaluate it and recurse
38
- // TODO: optimise with parallel evaluation if both takes are not present
39
- case (None , _) => Take .fromPull(leftPull).flatMap(l => loop(Some (l), rightTake, leftPull, rightPull))
40
- case (_, None ) => Take .fromPull(rightPull).flatMap(r => loop(leftTake, Some (r), leftPull, rightPull))
41
-
42
- // If one has ended, we always take the other
43
- case (Some (Take .End ), Some (Take .Value (r))) => IO .succeed((leftTake, None ), Take .Value (r))
44
- case (Some (Take .Value (l)), Some (Take .End )) => IO .succeed((None , rightTake), Take .Value (l))
45
-
46
- // If both are present, we take the smaller
47
- case (Some (Take .Value (l)), Some (Take .Value (r))) if l <= r =>
48
- IO .succeed((None , rightTake), Take .Value (l))
49
-
50
- case (Some (Take .Value (_)), Some (Take .Value (r))) =>
51
- IO .succeed((leftTake, None ), Take .Value (r))
52
- }
53
-
54
- leftStream.combine(rightStream)(
55
- (Option .empty[Take [E , A ]], Option .empty[Take [E , A ]])
56
- ) {
57
- case ((leftTake, rightTake), leftPull, rightPull) => loop(leftTake, rightTake, leftPull, rightPull)
58
- }
59
- }
15
+ // private[timeseries] def mergeOrderedSeqs[E, A](
16
+ // leftStream: Stream[E, A],
17
+ // rightStream: Stream[E, A]
18
+ // )(implicit o: Ordering[A]): Stream[E, A] = {
19
+ // import o._
20
+ //
21
+ // def loop(
22
+ // leftTake: Option[Take[E, A]],
23
+ // rightTake: Option[Take[E, A]],
24
+ // leftPull: Pull[Any, E, A],
25
+ // rightPull: Pull[Any, E, A]
26
+ // ): IO[E, ((Option[Take[E, A]], Option[Take[E, A]]), Take[E, A])] = (leftTake, rightTake) match {
27
+ // // both stopped so we stop
28
+ // case (Some(Take.end), Some(Take.end)) => IO.succeed((leftTake, rightTake), Take.end)
29
+ //
30
+ // // errors get forwarded
31
+ // case (Some(Fail(e)), _) => IO.succeed((None, None), Take.fail(e))
32
+ // case (_, Some(Fail(e))) => IO.succeed((None, None), Take.fail(e))
33
+ //
34
+ // // If one side is empty, we evaluate it and recurse
35
+ // // TODO: optimise with parallel evaluation if both takes are not present
36
+ // case (None, _) => Take.fromPull(leftPull).flatMap(l => loop(Some(l), rightTake, leftPull, rightPull))
37
+ // case (_, None) =>
38
+ // Take.fromPull(rightPull).flatMap(r => loop(leftTake, Some(r), leftPull, rightPull))
39
+ //
40
+ // // If one has ended, we always take the other
41
+ // case (Some(Take.end), Some(Take(Success(r)))) => IO.succeed((leftTake, None), Take.single(r))
42
+ // case (Some(Take(Success(l))), Some(Take.end)) => IO.succeed((None, rightTake), Take.single(l))
43
+ //
44
+ // // If both are present, we take the smaller
45
+ // case (Some(Take(Success(NonEmptyChunk))), Some(Take(Success(r)))) if l <= r =>
46
+ // IO.succeed((None, rightTake), Take.single(l))
47
+ //
48
+ // case (Some(Take(Success(_))), Some(Take(Success(Chunk(r))))) =>
49
+ // IO.succeed((leftTake, None), Take.single(r))
50
+ // }
51
+ //
52
+ // leftStream.combine(rightStream)(
53
+ // (Option.empty[Take[E, A]], Option.empty[Take[E, A]])
54
+ // ) {
55
+ // case ((leftTake, rightTake), leftPull, rightPull) => loop(leftTake, rightTake, leftPull, rightPull)
56
+ // }
57
+ // }
60
58
61
59
}
0 commit comments