Skip to content

Instantly share code, notes, and snippets.

@koen-dejonghe
Last active August 19, 2022 06:52
Show Gist options
  • Save koen-dejonghe/eb721125d28871e47ce0a1ff9c51ec30 to your computer and use it in GitHub Desktop.
Save koen-dejonghe/eb721125d28871e47ce0a1ff9c51ec30 to your computer and use it in GitHub Desktop.
case class SomeEvent(value: Long)
val events = Source
.tick(0 seconds, 250 millis, "")
.zipWithIndex
.map { case (_, l) =>
SomeEvent(l)
}
val group = Flow[SomeEvent].groupedWithin(100, 500 millis) // +/- 2 events per group
val slide = Flow[Seq[SomeEvent]].sliding(3, 1) // 3 groups per slide, step size = 1
val exe = events
.via(group)
.via(slide)
.map(_.flatten)
.runWith(Sink.foreach(println))
try Await.result(exe, 6 seconds)
catch { case _: Throwable => }
@koen-dejonghe
Copy link
Author

This will generate something like this:

Vector(SomeEvent(0), SomeEvent(1), SomeEvent(2), SomeEvent(3), SomeEvent(4), SomeEvent(5), SomeEvent(6))
Vector(SomeEvent(2), SomeEvent(3), SomeEvent(4), SomeEvent(5), SomeEvent(6), SomeEvent(7))
Vector(SomeEvent(5), SomeEvent(6), SomeEvent(7), SomeEvent(8), SomeEvent(9), SomeEvent(10))
Vector(SomeEvent(7), SomeEvent(8), SomeEvent(9), SomeEvent(10), SomeEvent(11))
Vector(SomeEvent(8), SomeEvent(9), SomeEvent(10), SomeEvent(11), SomeEvent(12), SomeEvent(13))
Vector(SomeEvent(11), SomeEvent(12), SomeEvent(13), SomeEvent(14), SomeEvent(15), SomeEvent(16))
Vector(SomeEvent(12), SomeEvent(13), SomeEvent(14), SomeEvent(15), SomeEvent(16), SomeEvent(17), SomeEvent(18))
Vector(SomeEvent(14), SomeEvent(15), SomeEvent(16), SomeEvent(17), SomeEvent(18), SomeEvent(19))
Vector(SomeEvent(17), SomeEvent(18), SomeEvent(19), SomeEvent(20), SomeEvent(21))

If you leave the .map(_.flatten) out, then you can still see the individual groups. For example:

Vector(Vector(SomeEvent(0), SomeEvent(1)), Vector(SomeEvent(2), SomeEvent(3), SomeEvent(4)), Vector(SomeEvent(5), SomeEvent(6)))
Vector(Vector(SomeEvent(2), SomeEvent(3), SomeEvent(4)), Vector(SomeEvent(5), SomeEvent(6)), Vector(SomeEvent(7)))
Vector(Vector(SomeEvent(5), SomeEvent(6)), Vector(SomeEvent(7)), Vector(SomeEvent(8), SomeEvent(9), SomeEvent(10)))
Vector(Vector(SomeEvent(7)), Vector(SomeEvent(8), SomeEvent(9), SomeEvent(10)), Vector(SomeEvent(11)))
Vector(Vector(SomeEvent(8), SomeEvent(9), SomeEvent(10)), Vector(SomeEvent(11)), Vector(SomeEvent(12), SomeEvent(13)))
Vector(Vector(SomeEvent(11)), Vector(SomeEvent(12), SomeEvent(13)), Vector(SomeEvent(14), SomeEvent(15)))
Vector(Vector(SomeEvent(12), SomeEvent(13)), Vector(SomeEvent(14), SomeEvent(15)), Vector(SomeEvent(16), SomeEvent(17), SomeEvent(18)))
Vector(Vector(SomeEvent(14), SomeEvent(15)), Vector(SomeEvent(16), SomeEvent(17), SomeEvent(18)), Vector(SomeEvent(19), SomeEvent(20)))
Vector(Vector(SomeEvent(16), SomeEvent(17), SomeEvent(18)), Vector(SomeEvent(19), SomeEvent(20)), Vector(SomeEvent(21)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment